/ Hex Artifact Content
Login

Artifact 913b3066b089463d23f21ae4925bce675dc352cf8e09552fe7a091166ce2449e:


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 75 75 69 64 2f 75 75 69 64 2e 68 3e  de <uuid/uuid.h>
0de0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0df0: 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  file.h>.# includ
0e00: 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a  e <sys/param.h>.
0e10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
0e20: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0e30: 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65  STYLE */..#if de
0e40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0e50: 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f 58   && ((__MAC_OS_X
0e60: 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
0e70: 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c 7c  UIRED > 1050) ||
0e80: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 5f                (_
0ea0: 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53 49  _IPHONE_OS_VERSI
0eb0: 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20  ON_MIN_REQUIRED 
0ec0: 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20 28  > 2000)).#  if (
0ed0: 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f  !defined(TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c 20  OS_EMBEDDED) || 
0ef0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0f00: 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20 20  DED==0)) \.     
0f10: 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 54    && (!defined(T
0f20: 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d  ARGET_IPHONE_SIM
0f30: 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52 47  ULATOR) || (TARG
0f40: 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c 41  ET_IPHONE_SIMULA
0f50: 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64 65  TOR==0)).#    de
0f60: 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f 53  fine HAVE_GETHOS
0f70: 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65 0a  TUUID 1.#  else.
0f80: 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67 65  #    warning "ge
0f90: 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20 64  thostuuid() is d
0fa0: 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e 64  isabled.".#  end
0fb0: 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  if.#endif...#if 
0fc0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63  OS_VXWORKS.# inc
0fd0: 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e  lude <sys/ioctl.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 65  h>.# include <se
0ff0: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e 63  maphore.h>.# inc
1000: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
1010: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
1020: 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65 66  ORKS */..#if def
1030: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1040: 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
1050: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
1060: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1070: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1080: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1090: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
10a0: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
10b0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
10c0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
10d0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
10e0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
10f0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
1100: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1110: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1120: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1130: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1140: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1150: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1160: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1170: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1180: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1190: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
11a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
11b0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
11c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
11d0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
11e0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
11f0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
1200: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1210: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1220: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1230: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1240: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1250: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1260: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1270: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1280: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1290: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12a0: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
12b0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
12c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
12d0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
12e0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
12f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1300: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1310: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1320: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1330: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1340: 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  Maximum supporte
1350: 64 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73  d symbolic links
1360: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
1370: 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20  TE_MAX_SYMLINKS 
1380: 31 30 30 0a 0a 2f 2a 20 41 6c 77 61 79 73 20 63  100../* Always c
1390: 61 73 74 20 74 68 65 20 67 65 74 70 69 64 28 29  ast the getpid()
13a0: 20 72 65 74 75 72 6e 20 74 79 70 65 20 66 6f 72   return type for
13b0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
13c0: 69 74 68 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d 6f  ith.** kernel mo
13d0: 64 75 6c 65 73 20 69 6e 20 56 78 57 6f 72 6b 73  dules in VxWorks
13e0: 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6f 73 47  . */.#define osG
13f0: 65 74 70 69 64 28 58 29 20 28 70 69 64 5f 74 29  etpid(X) (pid_t)
1400: 67 65 74 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a 20  getpid()../*.** 
1410: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1420: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1430: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1440: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1450: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1460: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1470: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
1480: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
1490: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
14a0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
14b0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
14c0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
14d0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
14e0: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
14f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1500: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1520: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1530: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1540: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1550: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1560: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1570: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
1580: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
1590: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
15a0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
15b0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
15c0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
15d0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
15e0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
15f0: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1600: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1610: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1620: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1630: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1640: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1650: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1660: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1670: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
1680: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
1690: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
16a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
16b0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
16c0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
16d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16e0: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
16f0: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1700: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1710: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1720: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1730: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1740: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1750: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1760: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1770: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
1780: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1790: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
17a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17b0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
17c0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
17d0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
17e0: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
17f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1800: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1810: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1820: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1830: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1840: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1850: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1860: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1870: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1880: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1890: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
18a0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
18b0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
18c0: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
18d0: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
18e0: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
18f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1900: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1910: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1920: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1930: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1940: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1950: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1960: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1970: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1980: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1990: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
19c0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
19d0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
19e0: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
19f0: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1a00: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1a10: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1a20: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1a30: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1a40: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1a50: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1a60: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1a70: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a90: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1aa0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1ab0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1ac0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1af0: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1b00: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1b10: 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
1b20: 73 65 64 3b 20 20 2f 2a 20 50 72 65 2d 61 6c 6c  sed;  /* Pre-all
1b30: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1b40: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1b50: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b70: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1b80: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1b90: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1bb0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1bc0: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1bd0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1c00: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1c10: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66  HUNK_SIZE */.#if
1c20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1c30: 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46  _SIZE>0.  int nF
1c40: 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20  etchOut;        
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
1c70: 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72 65  anding xFetch re
1c80: 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  fs */.  sqlite3_
1c90: 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20  int64 mmapSize; 
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1cb0: 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61  sable size of ma
1cc0: 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67  pping at pMapReg
1cd0: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
1ce0: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41  _int64 mmapSizeA
1cf0: 63 74 75 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  ctual;       /* 
1d00: 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d  Actual size of m
1d10: 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65  apping at pMapRe
1d20: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
1d30: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
1d40: 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Max;          /*
1d50: 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54   Configured FCNT
1d60: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75  L_MMAP_SIZE valu
1d70: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61  e */.  void *pMa
1d80: 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  pRegion;        
1d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1da0: 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67 69  mory mapped regi
1db0: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  on */.#endif.  i
1dc0: 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  nt sectorSize;  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73 65 63     /* Device sec
1df0: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
1e00: 74 20 64 65 76 69 63 65 43 68 61 72 61 63 74 65  t deviceCharacte
1e10: 72 69 73 74 69 63 73 3b 20 20 20 20 20 20 20 20  ristics;        
1e20: 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 64    /* Precomputed
1e30: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1e40: 72 69 73 74 69 63 73 20 2a 2f 0a 23 69 66 20 53  ristics */.#if S
1e50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1e60: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1e70: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1e80: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c         /* The fl
1eb0: 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74  ags specified at
1ec0: 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69   open() */.#endi
1ed0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1ee0: 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
1ef0: 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c  ION.  int protFl
1f00: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1f20: 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66 6c 61  a protection fla
1f30: 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70 65 6e  gs from unixOpen
1f40: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1f50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1f60: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1f70: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1f90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1fa0: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1fb0: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1fc0: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1fd0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1fe0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1ff0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
2000: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
2010: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
2020: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2030: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
2040: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
2050: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
2060: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
2070: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2080: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2090: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
20a0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
20b0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
20c0: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
20d0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
20e0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
20f0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2100: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
2110: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
2120: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2130: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2140: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2150: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
2160: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
2170: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2180: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
2190: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
21a0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
21b0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
21c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21d0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
21e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
21f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2200: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2210: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2220: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2230: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2240: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2250: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2260: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2270: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2280: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2290: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
22a0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
22b0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
22c0: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
22d0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
22e0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
22f0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
2300: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
2310: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
2320: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2330: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2340: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2350: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2360: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2370: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2380: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2390: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
23a0: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
23b0: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
23c0: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
23d0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
23e0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
23f0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2400: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
2410: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
2420: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2430: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2440: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2450: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2460: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2470: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2480: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2490: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
24a0: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
24b0: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
24c0: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
24d0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
24e0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
24f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
2500: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
2510: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
2520: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2530: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2540: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2550: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2560: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2570: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2580: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2590: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
25a0: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
25b0: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
25c0: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
25d0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
25e0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
25f0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
2600: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
2610: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
2620: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2630: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2640: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2650: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2660: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2670: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2680: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2690: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
26a0: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
26b0: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
26c0: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
26d0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
26e0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26f0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
2700: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
2710: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
2720: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2730: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2740: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2750: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2760: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2770: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2780: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2790: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
27a0: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
27b0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
27c0: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
27d0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
27e0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
27f0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
2800: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
2810: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
2820: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2830: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2840: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2850: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2860: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2870: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2880: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2890: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
28a0: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
28b0: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
28c0: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
28d0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
28e0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
28f0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
2900: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
2910: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
2920: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2930: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2940: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2950: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
2960: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
2970: 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b  ENABLE_SUPERLOCK
2980: 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   1.#endif..#if S
2990: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50  QLITE_ENABLE_SUP
29a0: 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64 65 20  ERLOCK.#include 
29b0: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63  "sqlite3.h".#inc
29c0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
29d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
29e0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72  .h>../*.** A str
29f0: 75 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c 65 63  ucture to collec
2a00: 74 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  t a busy-handler
2a10: 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 61 72   callback and ar
2a20: 67 75 6d 65 6e 74 20 61 6e 64 20 61 20 63 6f 75  gument and a cou
2a30: 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 75 6d  nt.** of the num
2a40: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 69 74 20  ber of times it 
2a50: 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64  has been invoked
2a60: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65  ..*/.struct Supe
2a70: 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20 69 6e  rlockBusy {.  in
2a80: 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a  t (*xBusy)(void*
2a90: 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20 2f 2a  ,int);        /*
2aa0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
2ab0: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
2ac0: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
2ad0: 73 79 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  syArg;          
2ae0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2af0: 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f 20 78  arg to pass to x
2b00: 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  Busy */.  int nB
2b10: 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  usy;            
2b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2b30: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 78 42 75  ber of times xBu
2b40: 73 79 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f  sy has been invo
2b50: 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65  ked */.};.typede
2b60: 66 20 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f  f struct Superlo
2b70: 63 6b 42 75 73 79 20 53 75 70 65 72 6c 6f 63 6b  ckBusy Superlock
2b80: 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  Busy;../*.** An 
2b90: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2ba0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2bb0: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
2bc0: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
2bd0: 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e 20 54  .** superlock. T
2be0: 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65  he opaque handle
2bf0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2c00: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
2c10: 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74 75 61  ck() is.** actua
2c20: 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
2c30: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2c40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
2c50: 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65 72 6c  */.struct Superl
2c60: 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  ock {.  sqlite3 
2c70: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
2c80: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2c90: 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20  ase handle used 
2ca0: 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a 20 20  to lock db */.  
2cb0: 69 6e 74 20 62 57 61 6c 3b 20 20 20 20 20 20 20  int bWal;       
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20 69 73  /* True if db is
2ce0: 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 20   a WAL database 
2cf0: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  */.};.typedef st
2d00: 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 20 53  ruct Superlock S
2d10: 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a 2a  uperlock;../*.**
2d20: 20 54 68 65 20 70 43 74 78 20 70 6f 69 6e 74 65   The pCtx pointe
2d30: 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  r passed to this
2d40: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 63 74   function is act
2d50: 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
2d60: 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c 6f 63  to a.** Superloc
2d70: 6b 42 75 73 79 20 73 74 72 75 63 74 75 72 65 2e  kBusy structure.
2d80: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
2d90: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
2da0: 6e 20 65 6e 63 61 70 73 75 6c 61 74 65 64 0a 2a  n encapsulated.*
2db0: 2a 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  * by the structu
2dc0: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  re and return th
2dd0: 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  e result..*/.sta
2de0: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
2df0: 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  kBusyHandler(voi
2e00: 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 55 4e 55  d *pCtx, int UNU
2e10: 53 45 44 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63  SED){.  Superloc
2e20: 6b 42 75 73 79 20 2a 70 42 75 73 79 20 3d 20 28  kBusy *pBusy = (
2e30: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 29  SuperlockBusy *)
2e40: 70 43 74 78 3b 0a 20 20 69 66 28 20 70 42 75 73  pCtx;.  if( pBus
2e50: 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20 72 65  y->xBusy==0 ) re
2e60: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
2e70: 20 70 42 75 73 79 2d 3e 78 42 75 73 79 28 70 42   pBusy->xBusy(pB
2e80: 75 73 79 2d 3e 70 42 75 73 79 41 72 67 2c 20 70  usy->pBusyArg, p
2e90: 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29 3b 0a  Busy->nBusy++);.
2ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2eb0: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2ec0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
2ed0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2ee0: 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 63 6f   file for .** co
2ef0: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 6f  nnection db is o
2f00: 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20  pen in WAL mode 
2f10: 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20 65 72  or not. If no er
2f20: 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ror occurs and t
2f30: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
2f40: 69 6c 65 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f  ile is in WAL mo
2f50: 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c 20 74  de, set *pbWal t
2f60: 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74 75 72  o true and retur
2f70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
2f80: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 69 6e 20  If it is not in 
2f90: 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a 70  WAL mode, set *p
2fa0: 62 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e 0a 2a  bWal to false..*
2fb0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2fc0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
2fd0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2fe0: 63 6f 64 65 2e 20 54 68 65 20 76 61 6c 75 65 20  code. The value 
2ff0: 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69 73 20  of *pbWal.** is 
3000: 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
3010: 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
3020: 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b 49  c int superlockI
3030: 73 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b 20 2a  sWal(Superlock *
3040: 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  pLock){.  int rc
3050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
3070: 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71  urn Code */.  sq
3080: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
3090: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
30a0: 20 43 6f 6d 70 69 6c 65 64 20 50 52 41 47 4d 41   Compiled PRAGMA
30b0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 74   journal_mode st
30c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72 63  atement */..  rc
30d0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
30e0: 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 50  re(pLock->db, "P
30f0: 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e  RAGMA main.journ
3100: 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20 26 70  al_mode", -1, &p
3110: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
3120: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3130: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 4c  return rc;..  pL
3140: 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b 0a 20  ock->bWal = 0;. 
3150: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
3160: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
3170: 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73  tmt) ){.    cons
3180: 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20  t char *zMode = 
3190: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
31a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
31b0: 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
31c0: 20 69 66 28 20 7a 4d 6f 64 65 20 26 26 20 73 74   if( zMode && st
31d0: 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33 20 26  rlen(zMode)==3 &
31e0: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
31f0: 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64 65 2c  mp("wal", zMode,
3200: 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
3210: 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 31 3b  pLock->bWal = 1;
3220: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3230: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e  turn sqlite3_fin
3240: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a  alize(pStmt);.}.
3250: 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 6e  ./*.** Obtain an
3260: 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 2d 6c   exclusive shm-l
3270: 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62 79 74  ock on nByte byt
3280: 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  es starting at o
3290: 66 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f 66 20  ffset idx.** of 
32a0: 74 68 65 20 66 69 6c 65 20 66 64 2e 20 49 66 20  the file fd. If 
32b0: 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
32c0: 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65  be obtained imme
32d0: 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b 65 0a  diately, invoke.
32e0: 2a 2a 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  ** the busy-hand
32f0: 6c 65 72 20 75 6e 74 69 6c 20 65 69 74 68 65 72  ler until either
3300: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
3310: 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  or the busy-hand
3320: 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  ler.** callback 
3330: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a 73 74  returns 0..*/.st
3340: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
3350: 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ckShmLock(.  sql
3360: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3380: 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
3390: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ndle */.  int id
33a0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
33b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
33c0: 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63 6b 20  set of shm-lock 
33d0: 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20 20 69  to obtain */.  i
33e0: 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3400: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
3410: 65 63 74 69 76 65 20 62 79 74 65 73 20 74 6f 20  ective bytes to 
3420: 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65 72 6c  lock */.  Superl
3430: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20  ockBusy *pBusy  
3440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73            /* Bus
3450: 79 2d 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65  y-handler wrappe
3460: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
3470: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 28   int rc;.  int (
3480: 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69 74  *xShmLock)(sqlit
3490: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c 20 69  e3_file*, int, i
34a0: 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d 3e 70  nt, int) = fd->p
34b0: 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63  Methods->xShmLoc
34c0: 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  k;.  do {.    rc
34d0: 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64 2c 20   = xShmLock(fd, 
34e0: 69 64 78 2c 20 6e 42 79 74 65 2c 20 53 51 4c 49  idx, nByte, SQLI
34f0: 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51 4c 49  TE_SHM_LOCK|SQLI
3500: 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
3510: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
3520: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
3530: 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e  superlockBusyHan
3540: 64 6c 65 72 28 28 76 6f 69 64 20 2a 29 70 42 75  dler((void *)pBu
3550: 73 79 2c 20 30 29 20 29 3b 0a 20 20 72 65 74 75  sy, 0) );.  retu
3560: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3570: 4f 62 74 61 69 6e 20 74 68 65 20 65 78 74 72 61  Obtain the extra
3580: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 64 61   locks on the da
3590: 74 61 62 61 73 65 20 66 69 6c 65 20 72 65 71 75  tabase file requ
35a0: 69 72 65 64 20 66 6f 72 20 57 41 4c 20 64 61 74  ired for WAL dat
35b0: 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76 6f 6b  abases..** Invok
35c0: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  e the supplied b
35d0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 73 20 72  usy-handler as r
35e0: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
35f0: 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b  ic int superlock
3600: 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74  WalLock(.  sqlit
3610: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
3620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
3630: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 70  tabase handle op
3640: 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61 62 61  en on WAL databa
3650: 73 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f 63  se */.  Superloc
3660: 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20 20 20  kBusy *pBusy    
3670: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20          /* Busy 
3680: 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20  handler wrapper 
3690: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
36a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36c0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
36d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
36e0: 2a 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *fd = 0;        
36f0: 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62     /* Main datab
3700: 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
3710: 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
3720: 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  le *p = 0;      
3730: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3740: 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  to first page of
3750: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
3760: 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
3770: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3780: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
3790: 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ect open on the 
37a0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 20 2a 2f  main db file. */
37b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
37c0: 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
37d0: 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
37e0: 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
37f0: 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66 64 29  ER, (void *)&fd)
3800: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3810: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
3820: 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  c;..  /* Obtain 
3830: 74 68 65 20 22 72 65 63 6f 76 65 72 79 22 20 6c  the "recovery" l
3840: 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  ock. Normally, t
3850: 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e 6c 79  his lock is only
3860: 20 6f 62 74 61 69 6e 65 64 20 62 79 0a 20 20 2a   obtained by.  *
3870: 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e 69 6e  * clients runnin
3880: 67 20 64 61 74 61 62 61 73 65 20 72 65 63 6f 76  g database recov
3890: 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63  ery.  .  */.  rc
38a0: 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c   = superlockShmL
38b0: 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 70 42  ock(fd, 2, 1, pB
38c0: 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  usy);.  if( rc!=
38d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
38e0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a 65 72  rn rc;..  /* Zer
38f0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
3900: 68 65 20 66 69 72 73 74 20 73 68 61 72 65 64 2d  he first shared-
3910: 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20 54 68 69  memory page. Thi
3920: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 79  s means that any
3930: 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 74 68  .  ** clients th
3940: 61 74 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  at open read or 
3950: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
3960: 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69  ns from this poi
3970: 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a 2a 20  nt on will.  ** 
3980: 68 61 76 65 20 74 6f 20 72 75 6e 20 72 65 63 6f  have to run reco
3990: 76 65 72 79 20 62 65 66 6f 72 65 20 70 72 6f 63  very before proc
39a0: 65 65 64 69 6e 67 2e 20 53 69 6e 63 65 20 74 68  eeding. Since th
39b0: 65 79 20 6e 65 65 64 20 74 68 65 20 22 72 65 63  ey need the "rec
39c0: 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f 63 6b  overy".  ** lock
39d0: 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
39e0: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 6f  ss is holding to
39f0: 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e 65 77   do that, no new
3a00: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 20   read or write. 
3a10: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
3a20: 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70 65 6e   may now be open
3a30: 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20 63 68  ed. Nor can a ch
3a40: 65 63 6b 70 6f 69 6e 74 20 62 65 20 72 75 6e 2c  eckpoint be run,
3a50: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61   for the.  ** sa
3a60: 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a 2f 0a  me reason..  */.
3a70: 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65 74 68    rc = fd->pMeth
3a80: 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66 64 2c  ods->xShmMap(fd,
3a90: 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 31 2c 20   0, 32*1024, 1, 
3aa0: 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  &p);.  if( rc!=S
3ab0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
3ac0: 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 28  n rc;.  memset((
3ad0: 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33 32 29  void *)p, 0, 32)
3ae0: 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 65  ;..  /* Obtain e
3af0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 6f  xclusive locks o
3b00: 6e 20 61 6c 6c 20 74 68 65 20 22 72 65 61 64 2d  n all the "read-
3b10: 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f 6e 63  lock" slots. Onc
3b20: 65 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a 20 20  e these locks.  
3b30: 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20 69 74 20  ** are held, it 
3b40: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
3b50: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
3b60: 61 63 74 69 76 65 20 72 65 61 64 65 72 2c 20 77  active reader, w
3b70: 72 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a 20 63  riter or .  ** c
3b80: 68 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c 69 65  heckpointer clie
3b90: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  nts..  */.  rc =
3ba0: 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63   superlockShmLoc
3bb0: 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f  k(fd, 3, SQLITE_
3bc0: 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70 42 75  SHM_NLOCK-3, pBu
3bd0: 73 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sy);.  return rc
3be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
3bf0: 73 65 20 61 20 73 75 70 65 72 6c 6f 63 6b 20 68  se a superlock h
3c00: 65 6c 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  eld on a databas
3c10: 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
3c20: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 0a  ment passed to .
3c30: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
3c40: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
3c50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
3c60: 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20  successful call 
3c70: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64 65 6d  to.** sqlite3dem
3c80: 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e 0a 2a  o_superlock()..*
3c90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3ca0: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
3cb0: 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c 6f 63  nlock(void *pLoc
3cc0: 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 20  k){.  Superlock 
3cd0: 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b 20  *p = (Superlock 
3ce0: 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70  *)pLock;.  if( p
3cf0: 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ->bWal ){.    in
3d00: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d20: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
3d30: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
3d40: 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
3d50: 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
3d60: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 73 71  XCLUSIVE;.    sq
3d70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
3d80: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
3d90: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
3da0: 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  l(p->db, "main",
3db0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49   SQLITE_FCNTL_FI
3dc0: 4c 45 5f 50 4f 49 4e 54 45 52 2c 0a 20 20 20 20  LE_POINTER,.    
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a           (void *
3df0: 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  )&fd);.    if( r
3e00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3e10: 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68 6f        fd->pMetho
3e20: 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64 2c  ds->xShmLock(fd,
3e30: 20 32 2c 20 31 2c 20 66 6c 61 67 73 29 3b 0a 20   2, 1, flags);. 
3e40: 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68 6f 64       fd->pMethod
3e50: 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64 2c 20  s->xShmLock(fd, 
3e60: 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  3, SQLITE_SHM_NL
3e70: 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29 3b 0a 20  OCK-3, flags);. 
3e80: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3e90: 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b  e3_close(p->db);
3ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3eb0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  p);.}../*.** Obt
3ec0: 61 69 6e 20 61 20 73 75 70 65 72 6c 6f 63 6b 20  ain a superlock 
3ed0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
3ee0: 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  file identified 
3ef0: 62 79 20 7a 50 61 74 68 2c 20 75 73 69 6e 67 20  by zPath, using 
3f00: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 70  the.** locking p
3f10: 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64  rimitives provid
3f20: 65 64 20 62 79 20 56 46 53 20 7a 56 66 73 2e 20  ed by VFS zVfs. 
3f30: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
3f40: 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72  QLITE_OK is.** r
3f50: 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75 74 70  eturned and outp
3f60: 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70 4c  ut variable *ppL
3f70: 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ock is populated
3f80: 20 77 69 74 68 20 61 6e 20 6f 70 61 71 75 65 20   with an opaque 
3f90: 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61 74 20 6d  handle.** that m
3fa0: 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ay be used with 
3fb0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
3fc0: 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 72 65 6c  runlock() to rel
3fd0: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  ease the lock..*
3fe0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
3ff0: 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c 6f 63 6b   occurs, *ppLock
4000: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
4010: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
4020: 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e 67 2e 20   code .** (e.g. 
4030: 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69 73 20  SQLITE_BUSY) is 
4040: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
4050: 49 66 20 61 20 72 65 71 75 69 72 65 64 20 6c 6f  If a required lo
4060: 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
4070: 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  ained immediatel
4080: 79 20 61 6e 64 20 74 68 65 20 78 42 75 73 79 20  y and the xBusy 
4090: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74 6f 20  parameter.** to 
40a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
40b0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
40c0: 78 42 75 73 79 20 69 73 20 69 6e 76 6f 6b 65 64  xBusy is invoked
40d0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
40e0: 0a 2a 2a 20 61 73 20 61 20 62 75 73 79 2d 68 61  .** as a busy-ha
40f0: 6e 64 6c 65 72 20 72 65 67 69 73 74 65 72 65 64  ndler registered
4100: 20 77 69 74 68 20 53 51 4c 69 74 65 20 28 75 73   with SQLite (us
4110: 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 75 73 79  ing sqlite3_busy
4120: 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a 2a 20 75  _handler()).** u
4130: 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68 65 20  ntil either the 
4140: 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f 62 74 61  lock can be obta
4150: 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75 73 79  ined or the busy
4160: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
4170: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 20 28  n returns.** 0 (
4180: 69 6e 64 69 63 61 74 69 6e 67 20 22 67 69 76 65  indicating "give
4190: 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61 74 69 63   up")..*/.static
41a0: 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65 6d 6f   int sqlite3demo
41b0: 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20 20 63 6f  _superlock(.  co
41c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41e0: 20 50 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   Path to databas
41f0: 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63 6b 20 2a  e file to lock *
4200: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4210: 7a 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  zVfs,           
4220: 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
4230: 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  e to access data
4240: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
4250: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
4260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4270: 64 64 69 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20  dditional flags 
4280: 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69 74  to pass to sqlit
4290: 65 33 5f 6f 70 65 6e 5f 76 32 20 2a 2f 0a 20 20  e3_open_v2 */.  
42a0: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
42b0: 64 2a 2c 69 6e 74 29 2c 20 20 20 20 20 20 20 20  d*,int),        
42c0: 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20  /* Busy handler 
42d0: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f  callback */.  vo
42e0: 69 64 20 2a 70 42 75 73 79 41 72 67 2c 20 20 20  id *pBusyArg,   
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4300: 20 43 6f 6e 74 65 78 74 20 61 72 67 20 66 6f 72   Context arg for
4310: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2a 2f   busy handler */
4320: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4c 6f 63 6b  .  void **ppLock
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6e 74 65     /* OUT: Conte
4350: 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 73 75  xt to pass to su
4360: 70 65 72 75 6e 6c 6f 63 6b 28 29 20 2a 2f 0a 29  perunlock() */.)
4370: 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42 75 73  {.  SuperlockBus
4380: 79 20 62 75 73 79 20 3d 20 7b 30 2c 20 30 2c 20  y busy = {0, 0, 
4390: 30 7d 3b 20 2f 2a 20 42 75 73 79 20 68 61 6e 64  0}; /* Busy hand
43a0: 6c 65 72 20 77 72 61 70 70 65 72 20 6f 62 6a 65  ler wrapper obje
43b0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ct */.  int rc; 
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
43e0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 53 75 70 65  n code */.  Supe
43f0: 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20  rlock *pLock;.. 
4400: 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33   pLock = sqlite3
4410: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53  _malloc(sizeof(S
4420: 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 20 20 69 66  uperlock));.  if
4430: 28 20 21 70 4c 6f 63 6b 20 29 20 72 65 74 75 72  ( !pLock ) retur
4440: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
4450: 20 20 6d 65 6d 73 65 74 28 70 4c 6f 63 6b 2c 20    memset(pLock, 
4460: 30 2c 20 73 69 7a 65 6f 66 28 53 75 70 65 72 6c  0, sizeof(Superl
4470: 6f 63 6b 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  ock));..  /* Ope
4480: 6e 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e  n a database han
4490: 64 6c 65 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  dle on the file 
44a0: 74 6f 20 73 75 70 65 72 6c 6f 63 6b 2e 20 2a 2f  to superlock. */
44b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
44c0: 6f 70 65 6e 5f 76 32 28 0a 20 20 20 20 20 20 7a  open_v2(.      z
44d0: 50 61 74 68 2c 20 26 70 4c 6f 63 6b 2d 3e 64 62  Path, &pLock->db
44e0: 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
44f0: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
4500: 50 45 4e 5f 43 52 45 41 54 45 7c 66 6c 61 67 73  PEN_CREATE|flags
4510: 2c 20 7a 56 66 73 0a 20 20 29 3b 0a 0a 20 20 2f  , zVfs.  );..  /
4520: 2a 20 49 6e 73 74 61 6c 6c 20 61 20 62 75 73 79  * Install a busy
4530: 2d 68 61 6e 64 6c 65 72 20 61 6e 64 20 65 78 65  -handler and exe
4540: 63 75 74 65 20 61 20 42 45 47 49 4e 20 45 58 43  cute a BEGIN EXC
4550: 4c 55 53 49 56 45 2e 20 49 66 20 74 68 69 73 20  LUSIVE. If this 
4560: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 20 57 41  is not.  ** a WA
4570: 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73  L database, this
4580: 20 69 73 20 61 6c 6c 20 77 65 20 6e 65 65 64 20   is all we need 
4590: 74 6f 20 64 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  to do.  .  **.  
45a0: 2a 2a 20 41 20 77 72 61 70 70 65 72 20 66 75 6e  ** A wrapper fun
45b0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
45c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
45d0: 2d 68 61 6e 64 6c 65 72 20 69 6e 73 74 65 61 64  -handler instead
45e0: 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73 74 65   of.  ** registe
45f0: 72 69 6e 67 20 74 68 65 20 62 75 73 79 2d 68 61  ring the busy-ha
4600: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 73  ndler function s
4610: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75  upplied by the u
4620: 73 65 72 20 64 69 72 65 63 74 6c 79 0a 20 20 2a  ser directly.  *
4630: 2a 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 54  * with SQLite. T
4640: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
4650: 68 65 20 73 61 6d 65 20 62 75 73 79 2d 68 61 6e  he same busy-han
4660: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d 61  dler function ma
4670: 79 20 62 65 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  y be.  ** invoke
4680: 64 20 64 69 72 65 63 74 6c 79 20 6c 61 74 65 72  d directly later
4690: 20 6f 6e 20 77 68 65 6e 20 61 74 74 65 6d 70 74   on when attempt
46a0: 69 6e 67 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ing to obtain th
46b0: 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 0a 20 20  e extra locks.  
46c0: 2a 2a 20 72 65 71 75 69 72 65 64 20 69 6e 20 57  ** required in W
46d0: 41 4c 20 6d 6f 64 65 2e 20 42 79 20 75 73 69 6e  AL mode. By usin
46e0: 67 20 74 68 65 20 77 72 61 70 70 65 72 2c 20 77  g the wrapper, w
46f0: 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 67 75  e are able to gu
4700: 61 72 61 6e 74 65 65 0a 20 20 2a 2a 20 74 68 61  arantee.  ** tha
4710: 74 20 74 68 65 20 22 6e 42 75 73 79 22 20 69 6e  t the "nBusy" in
4720: 74 65 67 65 72 20 70 61 72 61 6d 65 74 65 72 20  teger parameter 
4730: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 73  passed to the us
4740: 65 72 73 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ers busy-handler
4750: 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 73  .  ** represents
4760: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
4770: 72 20 6f 66 20 62 75 73 79 2d 68 61 6e 64 6c 65  r of busy-handle
4780: 72 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 61  r invocations ma
4790: 64 65 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74  de within.  ** t
47a0: 68 69 73 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  his call to sqli
47b0: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
47c0: 6b 28 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61  k(), including a
47d0: 6e 79 20 6d 61 64 65 20 64 75 72 69 6e 67 20 74  ny made during t
47e0: 68 65 0a 20 20 2a 2a 20 22 42 45 47 49 4e 20 45  he.  ** "BEGIN E
47f0: 58 43 4c 55 53 49 56 45 22 2e 0a 20 20 2a 2f 0a  XCLUSIVE"..  */.
4800: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4810: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 75 73 79 2e  _OK ){.    busy.
4820: 78 42 75 73 79 20 3d 20 78 42 75 73 79 3b 0a 20  xBusy = xBusy;. 
4830: 20 20 20 62 75 73 79 2e 70 42 75 73 79 41 72 67     busy.pBusyArg
4840: 20 3d 20 70 42 75 73 79 41 72 67 3b 0a 20 20 20   = pBusyArg;.   
4850: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
4860: 6e 64 6c 65 72 28 70 4c 6f 63 6b 2d 3e 64 62 2c  ndler(pLock->db,
4870: 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61   superlockBusyHa
4880: 6e 64 6c 65 72 2c 20 28 76 6f 69 64 20 2a 29 26  ndler, (void *)&
4890: 62 75 73 79 29 3b 0a 20 20 20 20 72 63 20 3d 20  busy);.    rc = 
48a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c 6f  sqlite3_exec(pLo
48b0: 63 6b 2d 3e 64 62 2c 20 22 42 45 47 49 4e 20 45  ck->db, "BEGIN E
48c0: 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20 30 2c  XCLUSIVE", 0, 0,
48d0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
48e0: 66 20 74 68 65 20 42 45 47 49 4e 20 45 58 43 4c  f the BEGIN EXCL
48f0: 55 53 49 56 45 20 77 61 73 20 65 78 65 63 75 74  USIVE was execut
4900: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
4910: 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 57 41  and this is a WA
4920: 4c 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  L.  ** database,
4930: 20 63 61 6c 6c 20 73 75 70 65 72 6c 6f 63 6b 57   call superlockW
4940: 61 6c 4c 6f 63 6b 28 29 20 74 6f 20 6f 62 74 61  alLock() to obta
4950: 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c 6f 63  in the extra loc
4960: 6b 73 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a  ks required.  **
4970: 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 61 64   to prevent read
4980: 65 72 73 2c 20 77 72 69 74 65 72 73 20 61 6e 64  ers, writers and
4990: 2f 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72  /or checkpointer
49a0: 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67  s from accessing
49b0: 20 74 68 65 0a 20 20 2a 2a 20 64 62 20 77 68 69   the.  ** db whi
49c0: 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
49d0: 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  is holding the s
49e0: 75 70 65 72 6c 6f 63 6b 2e 0a 20 20 2a 2a 0a 20  uperlock..  **. 
49f0: 20 2a 2a 20 42 65 66 6f 72 65 20 61 74 74 65 6d   ** Before attem
4a00: 70 74 69 6e 67 20 61 6e 79 20 57 41 4c 20 6c 6f  pting any WAL lo
4a10: 63 6b 73 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  cks, commit the 
4a20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
4a30: 74 65 64 20 61 62 6f 76 65 0a 20 20 2a 2a 20 74  ted above.  ** t
4a40: 6f 20 64 72 6f 70 20 74 68 65 20 57 41 4c 20 72  o drop the WAL r
4a50: 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 6c 6f  ead and write lo
4a60: 63 6b 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65  cks currently he
4a70: 6c 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ld. Otherwise, t
4a80: 68 65 0a 20 20 2a 2a 20 6e 65 77 20 57 41 4c 20  he.  ** new WAL 
4a90: 6c 6f 63 6b 73 20 6d 61 79 20 63 6f 6e 66 6c 69  locks may confli
4aa0: 63 74 20 77 69 74 68 20 74 68 65 20 6f 6c 64 2e  ct with the old.
4ab0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
4ac0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ad0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
4ae0: 28 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 49  (rc = superlockI
4af0: 73 57 61 6c 28 70 4c 6f 63 6b 29 29 20 26 26 20  sWal(pLock)) && 
4b00: 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 29 7b 0a 20  pLock->bWal ){. 
4b10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4b20: 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e 64 62  3_exec(pLock->db
4b30: 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
4b40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4b50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4b60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 75  .        rc = su
4b70: 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 70  perlockWalLock(p
4b80: 4c 6f 63 6b 2d 3e 64 62 2c 20 26 62 75 73 79 29  Lock->db, &busy)
4b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4ba0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
4bb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4bc0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
4bd0: 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a  runlock(pLock);.
4be0: 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 30 3b      *ppLock = 0;
4bf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
4c00: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
4c10: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
4c20: 0a 7d 0a 0a 2f 2a 20 41 20 63 6f 72 72 75 70 74  .}../* A corrupt
4c30: 20 44 42 20 77 6f 6e 27 74 20 77 6f 72 6b 20 77   DB won't work w
4c40: 69 74 68 20 74 68 65 20 73 71 6c 2d 62 61 73 65  ith the sql-base
4c50: 64 20 6c 6f 63 6b 69 6e 67 20 61 74 74 65 6d 70  d locking attemp
4c60: 74 2c 20 67 72 61 62 20 61 6e 20 0a 2a 2a 20 65  t, grab an .** e
4c70: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 6e  xclusive lock an
4c80: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
4c90: 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 42 55 53  OK or SQLITE_BUS
4ca0: 59 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 66 61  Y if the lock fa
4cb0: 69 6c 73 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ils .** returns 
4cc0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
4cd0: 20 6c 65 76 65 6c 20 68 65 6c 64 20 6f 6e 20 73   level held on s
4ce0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2f 0a 73  qlite3_file.*/.s
4cf0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
4d00: 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f  3demo_superlock_
4d10: 63 6f 72 72 75 70 74 28 0a 20 20 73 71 6c 69 74  corrupt(.  sqlit
4d20: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 0a 20 20 69  e3_file *id,.  i
4d30: 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65 4c 6f  nt eTargetFileLo
4d40: 63 6b 2c 0a 20 20 69 6e 74 20 2a 70 46 69 6c 65  ck,.  int *pFile
4d50: 4c 6f 63 6b 0a 29 7b 0a 20 20 75 6e 69 78 46 69  Lock.){.  unixFi
4d60: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
4d70: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
4d80: 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 46 69   eFileLock = pFi
4d90: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
4da0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4db0: 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 65 46  _OK;.  .  if( eF
4dc0: 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65 74 46  ileLock<eTargetF
4dd0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
4de0: 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
4df0: 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51  od->xLock(id, SQ
4e00: 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
4e10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63  );.  }.  if( !rc
4e20: 20 26 26 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f   && SQLITE_LOCK_
4e30: 53 48 41 52 45 44 3c 65 54 61 72 67 65 74 46 69  SHARED<eTargetFi
4e40: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63  leLock ){.    rc
4e50: 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
4e60: 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c  d->xLock(id, SQL
4e70: 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
4e80: 56 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  VE);.  }.  if( r
4e90: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  c ){.    if( pFi
4ea0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
4eb0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
4ec0: 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
4ed0: 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  d->xUnlock(id, e
4ee0: 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  FileLock);.    }
4ef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
4f00: 20 20 7d 0a 20 20 69 66 20 28 70 46 69 6c 65 4c    }.  if (pFileL
4f10: 6f 63 6b 29 20 7b 0a 20 20 20 20 2a 70 46 69 6c  ock) {.    *pFil
4f20: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
4f30: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
4f40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
4f50: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
4f60: 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
4f70: 5f 63 6f 72 72 75 70 74 28 73 71 6c 69 74 65 33  _corrupt(sqlite3
4f80: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
4f90: 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
4fa0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
4fb0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
4fc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4fd0: 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46  _OK;.  .  if( pF
4fe0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
4ff0: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5000: 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d    rc = pFile->pM
5010: 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69  ethod->xUnlock(i
5020: 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53  d, SQLITE_LOCK_S
5030: 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66  HARED);.  }.  if
5040: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
5050: 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29  ck > eFileLock )
5060: 7b 0a 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63 6b  {.    int unlock
5070: 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  RC = pFile->pMet
5080: 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c  hod->xUnlock(id,
5090: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e   SQLITE_LOCK_NON
50a0: 45 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29  E);.    if (!rc)
50b0: 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a   rc = unlockRC;.
50c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
50d0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
50e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45  LITE_ENABLE_SUPE
50f0: 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  RLOCK */.../*.**
5100: 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66   HAVE_MREMAP def
5110: 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e  aults to true on
5120: 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65   Linux and false
5130: 20 65 76 65 72 79 77 68 65 72 65 20 65 6c 73 65   everywhere else
5140: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
5150: 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23  d(HAVE_MREMAP).#
5160: 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   if defined(__li
5170: 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
5180: 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23  d(_GNU_SOURCE).#
5190: 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52    define HAVE_MR
51a0: 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20  EMAP 1.# else.# 
51b0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45   define HAVE_MRE
51c0: 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65  MAP 0.# endif.#e
51d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c  ndif../*.** Expl
51e0: 69 63 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20  icitly call the 
51f0: 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f  64-bit version o
5200: 66 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64  f lseek() on And
5210: 72 6f 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  roid. Otherwise,
5220: 20 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74   lseek().** is t
5230: 68 65 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f  he 32-bit versio
5240: 6e 2c 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45  n, even if _FILE
5250: 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20  _OFFSET_BITS=64 
5260: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
5270: 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f  ifdef __ANDROID_
5280: 5f 0a 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b  _.# define lseek
5290: 20 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a   lseek64.#endif.
52a0: 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f  .#ifdef __linux_
52b0: 5f 0a 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70  _./*.** Linux-sp
52c0: 65 63 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67  ecific IOCTL mag
52d0: 69 63 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20  ic numbers used 
52e0: 66 6f 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  for controlling 
52f0: 46 32 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  F2FS.*/.#define 
5300: 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43  F2FS_IOCTL_MAGIC
5310: 20 20 20 20 20 20 20 20 30 78 66 35 0a 23 64 65          0xf5.#de
5320: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54  fine F2FS_IOC_ST
5330: 41 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  ART_ATOMIC_WRITE
5340: 20 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f       _IO(F2FS_IO
5350: 43 54 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64  CTL_MAGIC, 1).#d
5360: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43  efine F2FS_IOC_C
5370: 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49  OMMIT_ATOMIC_WRI
5380: 54 45 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  TE    _IO(F2FS_I
5390: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23  OCTL_MAGIC, 2).#
53a0: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
53b0: 53 54 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57  START_VOLATILE_W
53c0: 52 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f  RITE   _IO(F2FS_
53d0: 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a  IOCTL_MAGIC, 3).
53e0: 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43  #define F2FS_IOC
53f0: 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f  _ABORT_VOLATILE_
5400: 57 52 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53  WRITE   _IO(F2FS
5410: 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29  _IOCTL_MAGIC, 5)
5420: 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f  .#define F2FS_IO
5430: 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53 20 20  C_GET_FEATURES  
5440: 20 20 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32           _IOR(F2
5450: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20  FS_IOCTL_MAGIC, 
5460: 31 32 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65  12, u32).#define
5470: 20 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54   F2FS_FEATURE_AT
5480: 4f 4d 49 43 5f 57 52 49 54 45 20 30 78 30 30 30  OMIC_WRITE 0x000
5490: 34 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69  4.#endif /* __li
54a0: 6e 75 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  nux__ */.../*.**
54b0: 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20   Different Unix 
54c0: 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20  systems declare 
54d0: 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72  open() in differ
54e0: 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20  ent ways.  Same 
54f0: 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73  use.** open(cons
5500: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65  t char*,int,mode
5510: 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65  _t).  Others use
5520: 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72   open(const char
5530: 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54  *,int,...)..** T
5540: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
5550: 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20   important when 
5560: 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  using a pointer 
5570: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  to the function.
5580: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73  .**.** The safes
5590: 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69  t way to deal wi
55a0: 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69  th the problem i
55b0: 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20  s to always use 
55c0: 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20  this wrapper.** 
55d0: 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61 73  which always has
55e0: 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64   the same well-d
55f0: 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65  efined interface
5600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5610: 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20  posixOpen(const 
5620: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74  char *zFile, int
5630: 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65   flags, int mode
5640: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
5650: 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d  (zFile, flags, m
5660: 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ode);.}../* Forw
5670: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5680: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
5690: 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
56a0: 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74  char*, int*);.st
56b0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
56c0: 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a  pagesize(void);.
56d0: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
56e0: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
56f0: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
5700: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
5710: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
5720: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
5730: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
5740: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
5750: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
5760: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
5770: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
5780: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
5790: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
57a0: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
57b0: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
57c0: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
57d0: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
57e0: 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73   struct unix_sys
57f0: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
5800: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
5810: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
5820: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
5830: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
5840: 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72  yscall_ptr pCurr
5850: 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  ent; /* Current 
5860: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73  value of the sys
5870: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
5880: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5890: 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44  r pDefault; /* D
58a0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
58b0: 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b  } aSyscall[] = {
58c0: 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20  .  { "open",    
58d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
58e0: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f  scall_ptr)posixO
58f0: 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  pen,  0  },.#def
5900: 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20  ine osOpen      
5910: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
5920: 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53  har*,int,int))aS
5930: 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65  yscall[0].pCurre
5940: 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22  nt)..  { "close"
5950: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5960: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c  3_syscall_ptr)cl
5970: 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ose,      0  },.
5980: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20  #define osClose 
5990: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
59a0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
59b0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63  urrent)..  { "ac
59c0: 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71  cess",       (sq
59d0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
59e0: 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20  r)access,     0 
59f0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63   },.#define osAc
5a00: 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29  cess    ((int(*)
5a10: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
5a20: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
5a30: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
5a40: 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71  tcwd",       (sq
5a50: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5a60: 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20  r)getcwd,     0 
5a70: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
5a80: 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28  tcwd    ((char*(
5a90: 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29  *)(char*,size_t)
5aa0: 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75  )aSyscall[3].pCu
5ab0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61  rrent)..  { "sta
5ac0: 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  t",         (sql
5ad0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5ae0: 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20  )stat,       0  
5af0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61  },.#define osSta
5b00: 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  t      ((int(*)(
5b10: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75  const char*,stru
5b20: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
5b30: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
5b40: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
5b50: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
5b60: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
5b70: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
5b80: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
5b90: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
5ba0: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
5bb0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
5bc0: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
5bd0: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
5be0: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
5bf0: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
5c00: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
5c10: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
5c20: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
5c30: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
5c40: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
5c50: 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61  JGPP__.  { "fsta
5c60: 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20  t",        0,   
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5c80: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
5c90: 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a  tat(a,b,c)    0.
5ca0: 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22  #else     .  { "
5cb0: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28  fstat",        (
5cc0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5cd0: 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20  ptr)fstat,      
5ce0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5cf0: 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28  Fstat     ((int(
5d00: 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74  *)(int,struct st
5d10: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  at*))aSyscall[5]
5d20: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
5d30: 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74  f..  { "ftruncat
5d40: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
5d50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75  syscall_ptr)ftru
5d60: 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64  ncate,  0  },.#d
5d70: 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74  efine osFtruncat
5d80: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
5d90: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36  ff_t))aSyscall[6
5da0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5db0: 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20   "fcntl",       
5dc0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5dd0: 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20  l_ptr)fcntl,    
5de0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5df0: 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e  osFcntl     ((in
5e00: 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e  t(*)(int,int,...
5e10: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
5e20: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65  urrent)..  { "re
5e30: 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ad",         (sq
5e40: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5e50: 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20  r)read,       0 
5e60: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65   },.#define osRe
5e70: 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ad      ((ssize_
5e80: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
5e90: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
5ea0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
5eb0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
5ec0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
5ed0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
5ee0: 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  YLE.  { "pread",
5ef0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5f00: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
5f10: 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  ad,      0  },.#
5f20: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22  else.  { "pread"
5f30: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5f40: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
5f50: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
5f60: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
5f70: 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69  sPread     ((ssi
5f80: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
5f90: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
5fa0: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
5fb0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5fc0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
5fd0: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
5fe0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5ff0: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34  call_ptr)pread64
6000: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
6010: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
6020: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6030: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
6040: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
6050: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
6060: 61 64 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a  ad64 ((ssize_t(*
6070: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
6080: 5f 74 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73  _t,off64_t))aSys
6090: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
60a0: 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c  t)..  { "write",
60b0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
60c0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69  _syscall_ptr)wri
60d0: 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  te,      0  },.#
60e0: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20  define osWrite  
60f0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
6100: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
6110: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
6120: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
6130: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
6140: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
6150: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
6160: 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74  STYLE.  { "pwrit
6170: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
6180: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
6190: 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c  write,     0  },
61a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
61b0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
61c0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
61d0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
61e0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
61f0: 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73   osPwrite    ((s
6200: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
6210: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
6220: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
6240: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
6250: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
6260: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
6270: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
6280: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6290: 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34  all_ptr)pwrite64
62a0: 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a  ,   0  },.#else.
62b0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
62c0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
62d0: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
62e0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
62f0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69  f.#define osPwri
6300: 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28  te64  ((ssize_t(
6310: 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  *)(int,const voi
6320: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f  d*,size_t,off64_
6330: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
6340: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
6350: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
6360: 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20  .  { "fchmod",  
6370: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6380: 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64  scall_ptr)fchmod
6390: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
63a0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
63b0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
63c0: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
63d0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
63e0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
63f0: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
6400: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
6410: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
6420: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
6430: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6440: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
6450: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
6460: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
6470: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
6480: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
64a0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
64b0: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
64c0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
64d0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
64e0: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
64f0: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
6500: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6510: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
6520: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6530: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
6540: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
6550: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
6560: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
6570: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
6580: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
6590: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
65a0: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
65b0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
65c0: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
65d0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
65e0: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
65f0: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
6600: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
6610: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
6620: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
6630: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
6640: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
6650: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
6660: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
6670: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
6680: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
6690: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
66a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
66b0: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
66c0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
66d0: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
66e0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
66f0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
6700: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
6710: 65 66 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f  efined(HAVE_FCHO
6720: 57 4e 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22  WN).  { "fchown"
6730: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
6740: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
6750: 6f 77 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20  own,          0 
6760: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63  },.#else.  { "fc
6770: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
6780: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
6790: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
67a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
67b0: 64 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20  define osFchown 
67c0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
67d0: 75 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79  uid_t,gid_t))aSy
67e0: 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65  scall[20].pCurre
67f0: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 65 75 69  nt)..  { "geteui
6800: 64 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  d",      (sqlite
6810: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
6820: 74 65 75 69 64 2c 20 20 20 20 20 20 20 20 20 30  teuid,         0
6830: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
6840: 74 65 75 69 64 20 20 20 28 28 75 69 64 5f 74 28  teuid   ((uid_t(
6850: 2a 29 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c  *)(void))aSyscal
6860: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
6870: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6880: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
6890: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
68a0: 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d  P_SIZE>0.  { "mm
68b0: 61 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ap",         (sq
68c0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
68d0: 72 29 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20  r)mmap,         
68e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
68f0: 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20  { "mmap",       
6900: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6910: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
6920: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6930: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d  dif.#define osMm
6940: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
6950: 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69  id*,size_t,int,i
6960: 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  nt,int,off_t))aS
6970: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
6980: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
6990: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
69a0: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
69b0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
69c0: 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20  { "munmap",     
69d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
69e0: 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20  ll_ptr)munmap,  
69f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6a00: 73 65 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c  se.  { "munmap",
6a10: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
6a20: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a40: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
6a50: 20 6f 73 4d 75 6e 6d 61 70 20 28 28 69 6e 74 28   osMunmap ((int(
6a60: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  *)(void*,size_t)
6a70: 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43  )aSyscall[23].pC
6a80: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56  urrent)..#if HAV
6a90: 45 5f 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65  E_MREMAP && (!de
6aa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6ab0: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
6ac0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
6ad0: 29 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20  ).  { "mremap", 
6ae0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
6af0: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61  yscall_ptr)mrema
6b00: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
6b10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d  .#else.  { "mrem
6b20: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
6b30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6b40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6b50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
6b60: 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28  fine osMremap ((
6b70: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
6b80: 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74  ize_t,size_t,int
6b90: 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32  ,...))aSyscall[2
6ba0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
6bb0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6bc0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
6bd0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
6be0: 49 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61  IZE>0.  { "getpa
6bf0: 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74  gesize",  (sqlit
6c00: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75  e3_syscall_ptr)u
6c10: 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20  nixGetpagesize, 
6c20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6c30: 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28  getpagesize",  (
6c40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6c50: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
6c60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6c70: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61  .#define osGetpa
6c80: 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28  gesize ((int(*)(
6c90: 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32  void))aSyscall[2
6ca0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
6cb0: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52  f defined(HAVE_R
6cc0: 45 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65  EADLINK).  { "re
6cd0: 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71  adlink",     (sq
6ce0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
6cf0: 72 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20  r)readlink,     
6d00: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6d10: 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20  { "readlink",   
6d20: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6d30: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
6d40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6d50: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  dif.#define osRe
6d60: 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74  adlink ((ssize_t
6d70: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
6d80: 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53  char*,size_t))aS
6d90: 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72  yscall[26].pCurr
6da0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
6db0: 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20  d(HAVE_LSTAT).  
6dc0: 7b 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20  { "lstat",      
6dd0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6de0: 61 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20  all_ptr)lstat,  
6df0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6e00: 73 65 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20  se.  { "lstat", 
6e10: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
6e20: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6e40: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
6e50: 20 6f 73 4c 73 74 61 74 20 20 20 20 20 20 28 28   osLstat      ((
6e60: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
6e70: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
6e80: 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43  )aSyscall[27].pC
6e90: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
6ea0: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
6eb0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
6ec0: 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
6ed0: 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 7b  TOMIC_WRITE).  {
6ee0: 20 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20   "ioctl",       
6ef0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6f00: 6c 6c 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20 20  ll_ptr)ioctl,   
6f10: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6f20: 65 0a 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20  e.  { "ioctl",  
6f30: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
6f40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6f60: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
6f70: 6f 73 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29  osIoctl ((int(*)
6f80: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
6f90: 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72  yscall[28].pCurr
6fa0: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
6fb0: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
6fc0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
6fd0: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73   */.../*.** On s
6fe0: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c  ome systems, cal
6ff0: 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77  ls to fchown() w
7000: 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65  ill trigger a me
7010: 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72  ssage in a secur
7020: 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68  ity.** log if th
7030: 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e  ey come from non
7040: 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e  -root processes.
7050: 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69    So avoid calli
7060: 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a  ng fchown() if.*
7070: 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e  * we are not run
7080: 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f  ning as root..*/
7090: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
70a0: 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  stFchown(int fd,
70b0: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
70c0: 74 20 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69  t gid){.#if defi
70d0: 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29  ned(HAVE_FCHOWN)
70e0: 0a 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65  .  return osGete
70f0: 75 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63  uid() ? 0 : osFc
7100: 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29  hown(fd,uid,gid)
7110: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
7120: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
7130: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
7140: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
7150: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
7160: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
7170: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
7180: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
7190: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
71a0: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
71b0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
71c0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
71d0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
71e0: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
71f0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
7200: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
7210: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
7220: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
7230: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
7240: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
7250: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
7260: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
7270: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
7280: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
72a0: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
72b0: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
72c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
72d0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
72e0: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
72f0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
7300: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
7310: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
7320: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7330: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
7340: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
7350: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
7360: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
7370: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
7380: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
7390: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
73a0: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
73b0: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
73c0: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
73d0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
73e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
73f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
7400: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
7410: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
7420: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
7430: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
7440: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
7450: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7460: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
7470: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
7480: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7490: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
74a0: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
74b0: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
74c0: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
74d0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
74e0: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
74f0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
7500: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
7510: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
7520: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
7530: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
7540: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7550: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
7560: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
7570: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
7580: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
7590: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
75a0: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
75b0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
75c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
75d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
75e0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
75f0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
7600: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
7610: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
7620: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
7630: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
7640: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7660: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7670: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7680: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
7690: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
76a0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
76b0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
76c0: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
76d0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
76e0: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
76f0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
7700: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
7710: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
7720: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
7730: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
7740: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
7750: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
7760: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
7770: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
7780: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
7790: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
77a0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
77b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
77c0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
77d0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
77e0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
77f0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
7800: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
7810: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
7820: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
7830: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
7840: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
7850: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
7860: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
7870: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
7880: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
7890: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
78a0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
78b0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
78c0: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
78d0: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
78e0: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
78f0: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
7900: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
7910: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
7920: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
7930: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
7940: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
7950: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
7960: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
7970: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
7980: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
7990: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
79a0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
79b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
79c0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
79d0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
79e0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
79f0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7a00: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
7a10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7a20: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
7a30: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
7a40: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
7a50: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7a60: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
7a70: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
7a80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7a90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  ;.}../*.** Do no
7aa0: 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c  t accept any fil
7ab0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73  e descriptor les
7ac0: 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
7ad0: 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  e, in order to a
7ae0: 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  void.** opening 
7af0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
7b00: 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70  ing file descrip
7b10: 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f  tors that are co
7b20: 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  mmonly used for 
7b30: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
7b40: 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20  ut, output, and 
7b50: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  error..*/.#ifnde
7b60: 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  f SQLITE_MINIMUM
7b70: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
7b80: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
7b90: 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45  _MINIMUM_FILE_DE
7ba0: 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69  SCRIPTOR 3.#endi
7bb0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  f../*.** Invoke 
7bc0: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
7bd0: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
7be0: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
7bf0: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
7c00: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
7c10: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
7c20: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
7c30: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
7c40: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
7c50: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
7c60: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
7c70: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
7c80: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
7c90: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
7ca0: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
7cb0: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
7cc0: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
7cd0: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
7ce0: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
7cf0: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
7d00: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
7d10: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
7d20: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
7d30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
7d40: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
7d50: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
7d60: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
7d70: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
7d80: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
7d90: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
7da0: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
7db0: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
7dc0: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
7dd0: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
7de0: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
7df0: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
7e00: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
7e10: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
7e20: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
7e30: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
7e40: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
7e50: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
7e60: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
7e70: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
7e80: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
7e90: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
7ea0: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
7eb0: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
7ec0: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
7ed0: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
7ee0: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
7ef0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
7f00: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
7f10: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
7f20: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
7f30: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
7f40: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
7f50: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
7f60: 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65  ISSIONS;.  while
7f70: 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  (1){.#if defined
7f80: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
7f90: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
7fa0: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
7fb0: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
7fc0: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
7fd0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c  ndif.    if( fd<
7fe0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
7ff0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f  rrno==EINTR ) co
8000: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72  ntinue;.      br
8010: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
8020: 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49  f( fd>=SQLITE_MI
8030: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
8040: 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20  IPTOR ) break;. 
8050: 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a     osClose(fd);.
8060: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
8070: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
8080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8090: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65   "attempt to ope
80a0: 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65  n \"%s\" as file
80b0: 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c   descriptor %d",
80c0: 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20   z, fd);.    fd 
80d0: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73  = -1;.    if( os
80e0: 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  Open("/dev/null"
80f0: 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61  , f, m)<0 ) brea
8100: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e  k;.  }.  if( fd>
8110: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
8120: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
8130: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
8140: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
8150: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
8160: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
8170: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
8180: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
8190: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
81a0: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
81b0: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
81c0: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
81d0: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
81e0: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
81f0: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
8200: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
8210: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
8220: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
8230: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
8240: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
8250: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
8260: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
8270: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
8280: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
8290: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
82a0: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
82b0: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
82c0: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
82d0: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
82e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
82f0: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
8300: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
8310: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
8320: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
8330: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
8340: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
8350: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
8360: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
8370: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
8380: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
8390: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
83a0: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
83b0: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
83c0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
83d0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
83e0: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
83f0: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
8400: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
8410: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
8420: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
8430: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
8440: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
8450: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
8460: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
8470: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8480: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
8490: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
84a0: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
84b0: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
84c0: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
84d0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
84e0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
84f0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
8500: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
8510: 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69  TIC_VFS1));.}.#i
8520: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8530: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
8540: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
8550: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
8560: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
8570: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
8580: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
8590: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
85a0: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
85b0: 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
85c0: 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  ACE./*.** Helper
85d0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
85e0: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
85f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
8600: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
8610: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
8620: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
8630: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
8640: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
8650: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
8660: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
8670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
8680: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
8690: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
86a0: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
86b0: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
86c0: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
86d0: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
86e0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
86f0: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
8700: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
8710: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
8720: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
8730: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
8740: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
8750: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
8760: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
8770: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
8780: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
8790: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
87a0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
87b0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
87c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
87d0: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
87e0: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
87f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8800: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
8810: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
8820: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
8830: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
8840: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
8850: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
8860: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
8870: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
8880: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
8890: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
88a0: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
88b0: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
88c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
88d0: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
88e0: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
88f0: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
8900: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
8910: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
8920: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
8930: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
8940: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
8950: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
8960: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
8970: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
8980: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
8990: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
89a0: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
89b0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
89c0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
89d0: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
89e0: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
89f0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
8a00: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
8a10: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
8a20: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
8a30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
8a40: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
8a50: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
8a60: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
8a70: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
8a80: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
8a90: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
8aa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
8ab0: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
8ac0: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
8ad0: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
8ae0: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
8af0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
8b00: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
8b10: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
8b20: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
8b30: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
8b40: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
8b50: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
8b60: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
8b70: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
8b80: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
8b90: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
8ba0: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
8bb0: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
8bc0: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
8bd0: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
8be0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
8bf0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
8c00: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
8c10: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
8c20: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
8c30: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
8c40: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
8c50: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
8c60: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
8c70: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
8c80: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
8c90: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
8ca0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8cb0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
8cc0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
8cd0: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
8ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
8cf0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
8d00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
8d10: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
8d20: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
8d30: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
8d40: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
8d50: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
8d60: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
8d70: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
8d80: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
8d90: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
8da0: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
8db0: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
8dc0: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
8dd0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
8de0: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
8df0: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
8e00: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
8e10: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
8e20: 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c  TR.**.** All cal
8e30: 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28  ls to ftruncate(
8e40: 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 69  ) within this fi
8e50: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  le should be mad
8e60: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69  e through.** thi
8e70: 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74  s wrapper.  On t
8e80: 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66  he Android platf
8e90: 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74  orm, bypassing t
8ea0: 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a  he logic below.*
8eb0: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
8ec0: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
8ed0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
8ee0: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
8ef0: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
8f00: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
8f10: 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f  nt rc;.#ifdef __
8f20: 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f  ANDROID__.  /* O
8f30: 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e  n Android, ftrun
8f40: 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75 73  cate() always us
8f50: 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74  es 32-bit offset
8f60: 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a  s, even if .  **
8f70: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
8f80: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
8f90: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20  . This means it 
8fa0: 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74  is unsafe to att
8fb0: 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75  empt to.  ** tru
8fc0: 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
8fd0: 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20  any size larger 
8fe0: 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e  than 2GiB. Silen
8ff0: 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20  tly ignore any. 
9000: 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74   ** such attempt
9010: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e  s.  */.  if( sz>
9020: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30  (sqlite3_int64)0
9030: 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20  x7FFFFFFF ){.   
9040: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9050: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
9060: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
9070: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
9080: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
9090: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
90a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
90b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
90c0: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
90d0: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
90e0: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
90f0: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
9100: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
9110: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
9120: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
9130: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
9140: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
9150: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
9160: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
9170: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
9180: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
9190: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
91a0: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
91b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
91c0: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
91d0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
91e0: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
91f0: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
9200: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
9210: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
9220: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
9230: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
9240: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
9250: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
9260: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
9270: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
9280: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
9290: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
92a0: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
92b0: 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20 28  r) {.  assert( (
92c0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
92d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
92e0: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
92f0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
9300: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
9310: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
9320: 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20     (sqliteIOErr 
9330: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
9340: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20  RDLOCK) ||.     
9350: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
9360: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
9370: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
9380: 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74 63 68  OCK) );.  switch
9390: 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a   (posixError) {.
93a0: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
93b0: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
93c0: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
93d0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
93e0: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
93f0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
9400: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
9410: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
9420: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
9430: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
9440: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
9450: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
9460: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
9470: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
9480: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9490: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
94a0: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
94b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
94c0: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66 61  ERM;.    .  defa
94d0: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
94e0: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
94f0: 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
9500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9540: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
9550: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
9560: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
9570: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
9580: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
9590: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
95a0: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
95b0: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
95c0: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
95d0: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
95e0: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
95f0: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
9600: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
9610: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
9620: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
9630: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
9640: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
9650: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
9660: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
9670: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
9680: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
9690: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
96a0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
96b0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
96c0: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
96d0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
96e0: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
96f0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
9700: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
9710: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
9720: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
9730: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
9740: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
9750: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
9760: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
9770: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
9780: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
9790: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
97a0: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
97b0: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
97c0: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
97d0: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
97e0: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
97f0: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
9800: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
9810: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
9820: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
9830: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
9840: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
9850: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
9860: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
9870: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
9880: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
9890: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
98a0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
98b0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
98c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
98d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
98e0: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
98f0: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
9900: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9920: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
9930: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
9940: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
9950: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
9960: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
9970: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
9980: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
9990: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
99a0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
99b0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
99c0: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
99d0: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
99e0: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
99f0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
9a00: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
9a10: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
9a20: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
9a30: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
9a40: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
9a50: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
9a60: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
9a70: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
9a80: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
9a90: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
9aa0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
9ab0: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
9ac0: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
9ad0: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
9ae0: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
9af0: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
9b00: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
9b10: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
9b20: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
9b30: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
9b40: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
9b50: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
9b60: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
9b70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
9b80: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
9b90: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
9ba0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9bb0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
9bc0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
9bd0: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
9be0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
9bf0: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
9c00: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
9c10: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
9c20: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
9c30: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
9c40: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
9c50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
9c60: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
9c70: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
9c80: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
9c90: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
9ca0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9cb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
9cc0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
9cd0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
9ce0: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
9cf0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
9d00: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
9d10: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
9d20: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
9d30: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
9d40: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
9d50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9d60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
9d70: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
9d80: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
9d90: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
9da0: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
9db0: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
9dc0: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
9dd0: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
9de0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
9df0: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
9e00: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
9e10: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
9e20: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
9e30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
9e40: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
9e50: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
9e60: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
9e70: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
9e80: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
9e90: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
9ea0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
9eb0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
9ec0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
9ed0: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
9ee0: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
9ef0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9f00: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
9f10: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
9f20: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
9f30: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
9f40: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
9f50: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
9f60: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
9f70: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
9f80: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
9f90: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
9fa0: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
9fb0: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
9fc0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
9fd0: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
9fe0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
9ff0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
a000: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
a030: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
a040: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
a050: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
a060: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
a070: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
a080: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
a090: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
a0a0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
a0b0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
a0c0: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
a0d0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
a0e0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
a0f0: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
a100: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
a110: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
a120: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
a130: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
a140: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
a150: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
a160: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
a170: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
a180: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
a190: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
a1a0: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
a1b0: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
a1c0: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
a1d0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
a1e0: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
a1f0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
a200: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
a210: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
a220: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
a230: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
a240: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
a250: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
a260: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
a270: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
a280: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
a290: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
a2a0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
a2b0: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
a2c0: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
a2d0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
a2e0: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
a2f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a300: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
a310: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
a320: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
a330: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
a340: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
a350: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
a360: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
a370: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
a380: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
a390: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
a3a0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
a3b0: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
a3c0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
a3d0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
a3e0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
a3f0: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
a400: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
a410: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
a420: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
a430: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
a440: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
a450: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
a460: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
a470: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
a480: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
a490: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
a4a0: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
a4b0: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
a4c0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
a4d0: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
a4e0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
a4f0: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
a500: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
a510: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
a520: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
a530: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
a540: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
a550: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
a560: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
a570: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
a580: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
a590: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
a5a0: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
a5b0: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
a5c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
a5d0: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
a5e0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
a5f0: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
a600: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
a610: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
a620: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
a630: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
a640: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
a650: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
a660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6a0: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
a6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6f0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
a700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a710: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
a720: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
a730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a740: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
a750: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
a760: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
a770: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
a780: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
a790: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
a7a0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
a7b0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
a7c0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
a7d0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
a7e0: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
a7f0: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
a800: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
a810: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
a820: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
a830: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
a840: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
a850: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
a860: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
a870: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
a880: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
a890: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
a8a0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
a8b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
a8c0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
a8d0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
a8e0: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
a8f0: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
a900: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
a910: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
a920: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
a930: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
a940: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
a950: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
a960: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
a970: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
a980: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
a990: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
a9a0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
a9b0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
a9c0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
a9d0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
a9e0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
a9f0: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
aa00: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
aa10: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
aa20: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
aa30: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
aa40: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
aa50: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
aa60: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
aa70: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
aa80: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
aa90: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
aaa0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
aab0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
aac0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
aad0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
aae0: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
aaf0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
ab00: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
ab10: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
ab20: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
ab30: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
ab40: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
ab50: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
ab60: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
ab70: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
ab80: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
ab90: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
aba0: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
abb0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
abc0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
abd0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
abe0: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
abf0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
ac00: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
ac10: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
ac20: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
ac30: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
ac40: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
ac50: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
ac60: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
ac70: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
ac80: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
ac90: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
aca0: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
acb0: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
acc0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
acd0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
ace0: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
acf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ad00: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
ad10: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
ad20: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
ad30: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
ad40: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
ad50: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
ad60: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
ad70: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
ad80: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
ad90: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
ada0: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
adb0: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
adc0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
add0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
ade0: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
adf0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
ae00: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
ae10: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
ae20: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
ae30: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
ae40: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
ae50: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
ae60: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
ae70: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
ae80: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
ae90: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
aea0: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
aeb0: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
aec0: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
aed0: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
aee0: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
aef0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
af00: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
af10: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
af20: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
af30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
af40: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
af50: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
af60: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
af70: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
af80: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
af90: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
afa0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
afb0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
afc0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
afd0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
afe0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
aff0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
b000: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
b010: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
b020: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
b030: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
b040: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
b050: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
b060: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
b070: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
b080: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
b090: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
b0a0: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
b0b0: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
b0c0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
b0d0: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
b0e0: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
b0f0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
b100: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
b110: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
b120: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
b130: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
b140: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
b150: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
b160: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
b170: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
b180: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
b190: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
b1a0: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
b1b0: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
b1c0: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
b1d0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
b1e0: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
b1f0: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
b200: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
b210: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
b220: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
b230: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
b240: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
b250: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
b260: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
b270: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
b280: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
b290: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
b2a0: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
b2b0: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
b2c0: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
b2d0: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
b2e0: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
b2f0: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
b300: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
b310: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
b320: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
b330: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
b340: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
b350: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
b360: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
b370: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
b380: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
b390: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
b3a0: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
b3b0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
b3c0: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
b3d0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
b3e0: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
b3f0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b400: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
b410: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
b420: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
b430: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
b440: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
b450: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
b460: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
b470: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
b480: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
b490: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
b4a0: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
b4b0: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
b4c0: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
b4d0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
b4e0: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
b4f0: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
b500: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
b510: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
b520: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b530: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
b540: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
b550: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
b560: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
b570: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
b580: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
b590: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
b5a0: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
b5b0: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
b5c0: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
b5d0: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
b5e0: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
b5f0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
b600: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
b610: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
b620: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
b630: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
b640: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
b650: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
b660: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
b670: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
b680: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
b690: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
b6a0: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
b6b0: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
b6c0: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
b6d0: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
b6e0: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
b6f0: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
b700: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
b710: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
b720: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
b730: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
b740: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
b750: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
b760: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
b770: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
b780: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
b790: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
b7a0: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
b7b0: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
b7c0: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
b7d0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
b7e0: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
b7f0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
b800: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
b810: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b820: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
b830: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
b840: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
b850: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
b860: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
b870: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
b880: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
b890: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
b8a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
b8b0: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
b8c0: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
b8d0: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
b8e0: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
b8f0: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
b900: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
b910: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
b920: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
b930: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
b940: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
b950: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
b960: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
b970: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
b980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
b990: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
b9a0: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
b9b0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
b9c0: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
b9d0: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
b9e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
b9f0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
ba00: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
ba10: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
ba20: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
ba30: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
ba40: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
ba50: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
ba60: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
ba70: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
ba80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
ba90: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
baa0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
bab0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
bac0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
bad0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
bae0: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
baf0: 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72 65 20  lse.  /* We are 
bb00: 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65 20 76  told that some v
bb10: 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72 6f  ersions of Andro
bb20: 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  id contain a bug
bb30: 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65 73   that.  ** sizes
bb40: 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20 33   ino_t at only 3
bb50: 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64 20 6f  2-bits instead o
bb60: 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65 65 0a  f 64-bits. (See.
bb70: 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e 64    ** https://and
bb80: 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f 67  roid-review.goog
bb90: 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f 63  lesource.com/#/c
bba0: 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74 2f 73  /115351/3/dist/s
bbb0: 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20 54  qlite3.c).  ** T
bbc0: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
bbd0: 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  is, always alloc
bbe0: 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f 72 20  ate 64-bits for 
bbf0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
bc00: 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61 6c  .  .  ** On smal
bc10: 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61 74 20  l machines that 
bc20: 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62 69 74  only have 32-bit
bc30: 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20 77 61   inodes, this wa
bc40: 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a 20 20  stes 4 bytes,.  
bc50: 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68 6f 75  ** but that shou
bc60: 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69 67 20  ld not be a big 
bc70: 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57 41  deal. */.  /* WA
bc80: 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  S:  ino_t ino;  
bc90: 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20 20   */.  u64 ino;  
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
bcc0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
bcd0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
bce0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
bcf0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
bd00: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
bd10: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
bd20: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
bd30: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
bd40: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
bd50: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
bd60: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
bd70: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
bd80: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
bd90: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
bda0: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
bdb0: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
bdc0: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
bdd0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
bde0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
bdf0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
be00: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
be10: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
be20: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
be30: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
be40: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
be50: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
be60: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
be70: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
be80: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
be90: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
bea0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
beb0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
bec0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bed0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
bee0: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
bef0: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
bf00: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
bf10: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
bf20: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
bf30: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
bf40: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
bf50: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
bf60: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
bf70: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
bf80: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bfb0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
bfc0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
bfd0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
bfe0: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
bff0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
c000: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
c010: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
c020: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
c050: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
c060: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
c070: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
c080: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
c090: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
c0a0: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
c0b0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
c0c0: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
c0d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
c0e0: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
c0f0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
c100: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
c110: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
c120: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
c130: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
c140: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
c150: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
c160: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
c170: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
c180: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
c190: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
c1a0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
c1b0: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
c1c0: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
c1d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
c1e0: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
c1f0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
c200: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
c210: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
c220: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
c230: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
c240: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
c250: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
c260: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
c270: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
c280: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
c290: 3b 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49 6e  ;  /* All unixIn
c2a0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
c2b0: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
c2c0: 65 64 20 69 6e 74 20 6e 55 6e 75 73 65 64 46 64  ed int nUnusedFd
c2d0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 6f 74 61   = 0;    /* Tota
c2e0: 6c 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  l unused file de
c2f0: 73 63 72 69 70 74 6f 72 73 20 2a 2f 0a 0a 2f 2a  scriptors */../*
c300: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
c310: 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72  tion - unixLogEr
c320: 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73 20  rorAtLine(), is 
c330: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
c340: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
c350: 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29  * unixLogError()
c360: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e  ..**.** It is in
c370: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
c380: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
c390: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e  n OS function an
c3a0: 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e  d errno has been
c3b0: 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73  .** set. It logs
c3c0: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
c3d0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
c3e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
c3f0: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
c400: 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20  * errno and, if 
c410: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
c420: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
c430: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72  ivalent from str
c440: 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74  error() or.** st
c450: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a  rerror_r()..**.*
c460: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
c470: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
c480: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
c490: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
c4a0: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
c4b0: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
c4c0: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
c4d0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
c4e0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
c4f0: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
c500: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
c510: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
c520: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
c530: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
c540: 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75   failed (e.g. "u
c550: 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20  nlink", "open") 
c560: 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74  and the associat
c570: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
c580: 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a  ath,.** if any..
c590: 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c  */.#define unixL
c5a0: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20  ogError(a,b,c)  
c5b0: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
c5c0: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49  tLine(a,b,c,__LI
c5d0: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
c5e0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
c5f0: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
c600: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
c610: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
c620: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
c630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
c640: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
c650: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
c660: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
c670: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
c680: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
c690: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
c6a0: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
c6b0: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
c6c0: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
c6f0: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
c700: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
c710: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20  {.  char *zErr; 
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c730: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66      /* Message f
c740: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
c750: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a  r equivalent */.
c760: 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65    int iErrno = e
c770: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
c780: 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61    /* Saved sysca
c790: 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  ll error number 
c7a0: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
c7b0: 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64   is not a thread
c7c0: 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49  safe build (SQLI
c7d0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
c7e0: 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a  ), then use.  **
c7f0: 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20   the strerror() 
c800: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  function to obta
c810: 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  in the human-rea
c820: 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  dable error mess
c830: 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c  age.  ** equival
c840: 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74  ent to errno. Ot
c850: 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72  herwise, use str
c860: 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20  error_r()..  */ 
c870: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
c880: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
c890: 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f  d(HAVE_STRERROR_
c8a0: 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38  R).  char aErr[8
c8b0: 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72  0];.  memset(aEr
c8c0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72  r, 0, sizeof(aEr
c8d0: 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45  r));.  zErr = aE
c8e0: 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52  rr;..  /* If STR
c8f0: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28  ERROR_R_CHAR_P (
c900: 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20  set by autoconf 
c910: 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53  scripts) or __US
c920: 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64  E_GNU is defined
c930: 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68  ,.  ** assume th
c940: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
c950: 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20 76  ovides the GNU v
c960: 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72  ersion of strerr
c970: 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a  or_r() that.  **
c980: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
c990: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
c9a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
c9b0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
c9c0: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
c9d0: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
c9e0: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
c9f0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
ca00: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
ca10: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
ca20: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
ca30: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
ca40: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
ca50: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
ca60: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
ca70: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
ca80: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
ca90: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
caa0: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
cab0: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
cac0: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
cad0: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
cae0: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
caf0: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
cb00: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
cb10: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
cb20: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
cb30: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
cb40: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
cb50: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
cb60: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
cb70: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
cb80: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
cb90: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
cba0: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
cbb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
cbc0: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
cbd0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
cbe0: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
cbf0: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
cc00: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
cc10: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
cc20: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
cc30: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
cc40: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
cc50: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
cc60: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
cc70: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
cc80: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
cc90: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
cca0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
ccb0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
ccc0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
ccd0: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
cce0: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a 50  #endif..  if( zP
ccf0: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
cd00: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
cd10: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
cd20: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
cd30: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
cd40: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
cd50: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
cd60: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
cd70: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
cd80: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
cd90: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
cda0: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
cdb0: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
cdc0: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
cdd0: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
cde0: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
cdf0: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
ce00: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
ce10: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
ce20: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
ce30: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
ce40: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
ce50: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
ce60: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
ce70: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
ce80: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
ce90: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
cea0: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
ceb0: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
cec0: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
ced0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
cee0: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
cef0: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
cf00: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
cf10: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
cf20: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
cf30: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
cf40: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
cf50: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
cf60: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
cf70: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
cf80: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
cf90: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
cfa0: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
cfb0: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
cfc0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
cfd0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
cfe0: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
d010: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
d020: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
d030: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46 69  *.** Set the pFi
d040: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20  le->lastErrno.  
d050: 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  Do this in a sub
d060: 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74 20  routine as that 
d070: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f  provides.** a co
d080: 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
d090: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
d0a0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
d0b0: 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  id storeLastErrn
d0c0: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
d0d0: 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20  e, int error){. 
d0e0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d0f0: 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  o = error;.}../*
d100: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
d110: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
d120: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
d130: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
d140: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
d150: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c   .static void cl
d160: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e  osePendingFds(un
d170: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
d180: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d190: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
d1a0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
d1b0: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
d1c0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
d1d0: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
d1e0: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
d1f0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
d200: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 23  xt = p->pNext;.#
d210: 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b  if OSCLOSE_CHECK
d220: 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20  _CLOSE_IOERR.   
d230: 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64   if( close(p->fd
d240: 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
d250: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
d260: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
d270: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
d280: 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d  _CLOSE;.      p-
d290: 3e 70 4e 65 78 74 20 3d 20 70 45 72 72 6f 72 3b  >pNext = pError;
d2a0: 0a 20 20 20 20 20 20 70 45 72 72 6f 72 20 3d 20  .      pError = 
d2b0: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
d2c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d2d0: 28 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  (p);.    }.#else
d2e0: 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
d2f0: 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20  e(pFile, p->fd, 
d300: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73  __LINE__);.    s
d310: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
d320: 23 65 6e 64 69 66 0a 20 20 20 20 6e 55 6e 75 73  #endif.    nUnus
d330: 65 64 46 64 2d 2d 3b 0a 20 20 7d 0a 20 20 70 49  edFd--;.  }.  pI
d340: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
d350: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
d360: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
d370: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
d380: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
d390: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
d3a0: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
d3b0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
d3c0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
d3d0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
d3e0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
d3f0: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
d400: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d410: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d420: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
d430: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
d440: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
d450: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
d460: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
d470: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
d480: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
d490: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
d4a0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
d4b0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
d4c0: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
d4d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d4e0: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
d4f0: 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 );.      close
d500: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
d510: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
d520: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
d530: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d540: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
d550: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
d560: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
d570: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
d580: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
d590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d5a0: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
d5b0: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
d5c0: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
d5d0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
d5e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d5f0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
d600: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
d610: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
d620: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
d630: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
d640: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
d650: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
d660: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d670: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
d680: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
d690: 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c    assert( inodeL
d6a0: 69 73 74 21 3d 30 20 7c 7c 20 6e 55 6e 75 73 65  ist!=0 || nUnuse
d6b0: 64 46 64 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  dFd==0 );.}../*.
d6c0: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
d6d0: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
d6e0: 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  te the unixInode
d6f0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
d700: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
d710: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
d720: 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  or.  Create a ne
d730: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
d740: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
d750: 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62  rn value might b
d760: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
d770: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
d780: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  rs..**.** The mu
d790: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
d7a0: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
d7b0: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
d7c0: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
d7d0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
d7e0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
d7f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70  .** Return an ap
d800: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
d810: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
d820: 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  int findInodeInf
d830: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
d840: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
d850: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
d860: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
d870: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
d880: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
d890: 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20  fo **ppInode    
d8a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
d8b0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
d8c0: 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29  object here */.)
d8d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c     /* System cal
d900: 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  l return code */
d910: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
d940: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69  scriptor for pFi
d950: 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  le */.  struct u
d960: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
d970: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
d980: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
d990: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20  xInodeInfo */.  
d9a0: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
d9b0: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  buf;           /
d9c0: 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
d9d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
d9e0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d9f0: 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20  *pInode = 0;    
da00: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
da10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
da20: 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ct */..  assert(
da30: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
da40: 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f   );..  /* Get lo
da50: 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74  w-level informat
da60: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69  ion about the fi
da70: 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75  le that we can u
da80: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61  sed to.  ** crea
da90: 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65  te a unique name
daa0: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20   for the file.. 
dab0: 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65   */.  fd = pFile
dac0: 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  ->h;.  rc = osFs
dad0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
dae0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
daf0: 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
db00: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
db10: 6f 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  o);.#if defined(
db20: 45 4f 56 45 52 46 4c 4f 57 29 20 26 26 20 64 65  EOVERFLOW) && de
db30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 53  fined(SQLITE_DIS
db40: 41 42 4c 45 5f 4c 46 53 29 0a 20 20 20 20 69 66  ABLE_LFS).    if
db50: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
db60: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
db70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
db80: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
db90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
dba0: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
dbb0: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
dbc0: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
dbd0: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
dbe0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
dbf0: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
dc00: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
dc10: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
dc20: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
dc30: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
dc40: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
dc50: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
dc60: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
dc70: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
dc80: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
dc90: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
dca0: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
dcb0: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
dcc0: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
dcd0: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
dce0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
dcf0: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
dd00: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
dd10: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
dd20: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
dd30: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
dd40: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
dd50: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
dd60: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
dd70: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
dd80: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
dd90: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
dda0: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
ddb0: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
ddc0: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
ddd0: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
dde0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
ddf0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
de00: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
de10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
de20: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
de30: 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61  && (pFile->fsFla
de40: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
de50: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30  AGS_IS_MSDOS)!=0
de60: 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d   ){.    do{ rc =
de70: 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22   osWrite(fd, "S"
de80: 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  , 1); }while( rc
de90: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
dea0: 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  TR );.    if( rc
deb0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  !=1 ){.      sto
dec0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
ded0: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
dee0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
def0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
df00: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
df10: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
df20: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
df30: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
df40: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
df50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
df60: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
df70: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
df80: 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20  memset(&fileId, 
df90: 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  0, sizeof(fileId
dfa0: 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76  ));.  fileId.dev
dfb0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
dfc0: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
dfd0: 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d  S.  fileId.pId =
dfe0: 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c   pFile->pId;.#el
dff0: 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20  se.  fileId.ino 
e000: 3d 20 28 75 36 34 29 73 74 61 74 62 75 66 2e 73  = (u64)statbuf.s
e010: 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20  t_ino;.#endif.  
e020: 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73  assert( inodeLis
e030: 74 21 3d 30 20 7c 7c 20 6e 55 6e 75 73 65 64 46  t!=0 || nUnusedF
e040: 64 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 6f 64 65  d==0 );.  pInode
e050: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
e060: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
e070: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
e080: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
e090: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
e0a0: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
e0b0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
e0c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
e0d0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
e0e0: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
e0f0: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
e100: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
e110: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
e120: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e130: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
e140: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
e150: 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  pInode, 0, sizeo
e160: 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20  f(*pInode));.   
e170: 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d   memcpy(&pInode-
e180: 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64  >fileId, &fileId
e190: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
e1a0: 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  );.    pInode->n
e1b0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e  Ref = 1;.    pIn
e1c0: 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f  ode->pNext = ino
e1d0: 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f  deList;.    pIno
e1e0: 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  de->pPrev = 0;. 
e1f0: 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74     if( inodeList
e200: 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50   ) inodeList->pP
e210: 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  rev = pInode;.  
e220: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
e230: 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  node;.  }else{. 
e240: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b     pInode->nRef+
e250: 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64  +;.  }.  *ppInod
e260: 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65  e = pInode;.  re
e270: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e280: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
e290: 54 52 55 45 20 69 66 20 70 46 69 6c 65 20 68 61  TRUE if pFile ha
e2a0: 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f  s been renamed o
e2b0: 72 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65  r unlinked since
e2c0: 20 69 74 20 77 61 73 20 66 69 72 73 74 20 6f 70   it was first op
e2d0: 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ened..*/.static 
e2e0: 69 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76 65 64  int fileHasMoved
e2f0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
e300: 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
e310: 53 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  S.  return pFile
e320: 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 20 70  ->pInode!=0 && p
e330: 46 69 6c 65 2d 3e 70 49 64 21 3d 70 46 69 6c 65  File->pId!=pFile
e340: 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  ->pInode->fileId
e350: 2e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74  .pId;.#else.  st
e360: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
e370: 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70   return pFile->p
e380: 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20 20 20  Inode!=0 &&.    
e390: 20 20 28 6f 73 53 74 61 74 28 70 46 69 6c 65 2d    (osStat(pFile-
e3a0: 3e 7a 50 61 74 68 2c 20 26 62 75 66 29 21 3d 30  >zPath, &buf)!=0
e3b0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 75   .         || (u
e3c0: 36 34 29 62 75 66 2e 73 74 5f 69 6e 6f 21 3d 70  64)buf.st_ino!=p
e3d0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69  File->pInode->fi
e3e0: 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69  leId.ino);.#endi
e3f0: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
e400: 6b 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61  k a unixFile tha
e410: 74 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e  t is a database.
e420: 20 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c    Verify the fol
e430: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31  lowing:.**.** (1
e440: 29 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  ) There is exact
e450: 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b  ly one hard link
e460: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
e470: 28 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20  (2) The file is 
e480: 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c  not a symbolic l
e490: 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66  ink.** (3) The f
e4a0: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
e4b0: 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69   renamed or unli
e4c0: 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65  nked.**.** Issue
e4d0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
e4e0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29  ITE_WARNING,...)
e4f0: 20 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79   messages if any
e500: 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67  thing is not rig
e510: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ht..*/.static vo
e520: 69 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  id verifyDbFile(
e530: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
e540: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  {.  struct stat 
e550: 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  buf;.  int rc;..
e560: 20 20 2f 2a 20 54 68 65 73 65 20 76 65 72 69 66    /* These verif
e570: 69 63 61 74 69 6f 6e 73 20 6f 63 63 75 72 73 20  ications occurs 
e580: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
e590: 61 62 61 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  abase only */.  
e5a0: 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
e5b0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
e5c0: 4e 4f 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 3b  NOLOCK ) return;
e5d0: 0a 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ..  rc = osFstat
e5e0: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
e5f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
e600: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
e610: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
e620: 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20 64   "cannot fstat d
e630: 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69 6c  b file %s", pFil
e640: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
e650: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
e660: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30   buf.st_nlink==0
e670: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
e680: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
e690: 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b  NG, "file unlink
e6a0: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
e6b0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
e6c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
e6d0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
e6e0: 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73  nlink>1 ){.    s
e6f0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
e700: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74  E_WARNING, "mult
e710: 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69  iple links to fi
e720: 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  le: %s", pFile->
e730: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
e740: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69  rn;.  }.  if( fi
e750: 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65  leHasMoved(pFile
e760: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
e770: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
e780: 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d  ING, "file renam
e790: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
e7a0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
e7b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
e7c0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
e7d0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
e7e0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
e7f0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
e800: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
e810: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
e820: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
e830: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
e840: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
e850: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
e860: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
e870: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
e880: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
e890: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
e8a0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
e8b0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
e8c0: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
e8d0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
e8e0: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
e8f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e900: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
e910: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
e920: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
e930: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
e940: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e950: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
e960: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e970: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e980: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
e990: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
e9a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
e9b0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
e9c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e9d0: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
e9e0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e9f0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
ea00: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
ea10: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
ea20: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
ea30: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
ea40: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
ea50: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
ea60: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
ea70: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
ea80: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
ea90: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
eaa0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
eab0: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
eac0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
ead0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
eae0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
eaf0: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
eb00: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
eb10: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
eb20: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
eb30: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
eb40: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
eb50: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
eb60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
eb70: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
eb80: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
eb90: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
eba0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ebb0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
ebc0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
ebd0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
ebe0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
ebf0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 23 69 66 20  , &lock) ){.#if 
ec00: 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
ec10: 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
ec20: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
ec30: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
ec40: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
ec50: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
ec60: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
ec70: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
ec80: 29 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  );.      storeLa
ec90: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
eca0: 45 72 72 6e 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  Errno);.#else.  
ecb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ecc0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
ecd0: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  VEDLOCK;.      s
ece0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
ecf0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e  ile, errno);.#en
ed00: 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  dif.    } else i
ed10: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
ed20: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
ed30: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
ed40: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
ed50: 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
ed60: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
ed70: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
ed80: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
ed90: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
eda0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
edb0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
edc0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
edd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
ede0: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
edf0: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
ee00: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
ee10: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
ee20: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
ee30: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
ee40: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
ee50: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
ee60: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
ee70: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
ee80: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
ee90: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
eea0: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
eeb0: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
eec0: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
eed0: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
eee0: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
eef0: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
ef00: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
ef10: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
ef20: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
ef30: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
ef40: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
ef50: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
ef60: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
ef70: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
ef80: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
ef90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
efa0: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
efb0: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
efc0: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
efd0: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
efe0: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
eff0: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
f000: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
f010: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f020: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
f030: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
f040: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
f050: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
f060: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
f070: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
f080: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
f090: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
f0a0: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
f0b0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
f0c0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
f0d0: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
f0e0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
f0f0: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
f100: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
f110: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
f120: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
f130: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
f140: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
f150: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
f160: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
f170: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
f180: 6b 20 2a 70 4c 6f 63 6b 2c 20 69 6e 74 20 6e 52  k *pLock, int nR
f190: 65 74 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  etry){.  int rc;
f1a0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
f1b0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
f1c0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
f1d0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
f1e0: 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d() );.  assert(
f1f0: 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20   pInode!=0 );.  
f200: 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  if( (pFile->ctrl
f210: 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46 49 4c  Flags & (UNIXFIL
f220: 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c 45 5f  E_EXCL|UNIXFILE_
f230: 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58 46 49  RDONLY))==UNIXFI
f240: 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20 20 69  LE_EXCL ){.    i
f250: 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
f260: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
f270: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
f280: 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73   lock;.      ass
f290: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
f2a0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c  ck==0 );.      l
f2b0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f2c0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
f2d0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f2e0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f2f0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f300: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f310: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f320: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_WRLCK;.      r
f330: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
f340: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
f350: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  lock);.      if(
f360: 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72   rc<0 ) return r
f370: 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  c;.      pInode-
f380: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20  >bProcessLock = 
f390: 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  1;.      pInode-
f3a0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65  >nLock++;.    }e
f3b0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
f3c0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
f3d0: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 20 0a 20 20 20 20 66 6f 72 28 3b        .    for(;
f400: 3b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  ;){.      rc = o
f410: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
f420: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
f430: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 26  ;.      if( rc &
f440: 26 20 6e 52 65 74 72 79 2d 2d 20 29 7b 0a 20 20  & nRetry-- ){.  
f450: 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30        usleep(100
f460: 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20 20 20 20   * (++i));.     
f470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f480: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
f490: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
f4a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
f4b0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
f4c0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
f4d0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
f4e0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
f4f0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
f500: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
f510: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
f520: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
f530: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
f540: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
f550: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
f560: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
f570: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
f580: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
f590: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
f5a0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
f5b0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
f5c0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
f5d0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
f5e0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
f5f0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
f600: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
f610: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
f620: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
f630: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
f640: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
f650: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
f660: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
f670: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
f680: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
f690: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
f6a0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
f6b0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
f6c0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
f6d0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
f6e0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
f6f0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
f700: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
f710: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
f720: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
f730: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
f740: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
f750: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
f760: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
f770: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
f780: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
f790: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
f7a0: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
f7b0: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
f7c0: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
f7d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
f7e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f7f0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
f800: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
f810: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
f820: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
f830: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
f840: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
f850: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
f860: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
f870: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
f880: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
f890: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
f8a0: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
f8b0: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
f8c0: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
f8d0: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
f8e0: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
f8f0: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
f900: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
f910: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
f920: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
f930: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
f940: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
f950: 68 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74  h Windows95 syst
f960: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
f970: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
f980: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
f990: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
f9a0: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
f9b0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
f9c0: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
f9d0: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
f9e0: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
f9f0: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
fa00: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
fa10: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
fa20: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
fa30: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
fa40: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
fa50: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
fa60: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
fa70: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
fa80: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
fa90: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
faa0: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
fab0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
fac0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
fad0: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
fae0: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
faf0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 27 73 68   successful, 'sh
fb00: 61 72 65 64 20 62 79 74 65 20 72 61 6e 67 65 27  ared byte range'
fb10: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a   is read-locked.
fb20: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63    ** and the loc
fb30: 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  k on the 'pendin
fb40: 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64  g byte' released
fb50: 2e 20 20 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a  .  (Legacy note:
fb60: 20 20 57 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69    When.  ** SQLi
fb70: 74 65 20 77 61 73 20 66 69 72 73 74 20 64 65 76  te was first dev
fb80: 65 6c 6f 70 65 64 2c 20 57 69 6e 64 6f 77 73 39  eloped, Windows9
fb90: 35 20 73 79 73 74 65 6d 73 20 77 65 72 65 20 73  5 systems were s
fba0: 74 69 6c 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e  till very common
fbb0: 2c 0a 20 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f  ,.  ** and Widno
fbc0: 77 73 39 35 20 6c 61 63 6b 73 20 61 20 73 68 61  ws95 lacks a sha
fbd0: 72 65 64 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c  red-lock capabil
fbe0: 69 74 79 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64  ity.  So on Wind
fbf0: 6f 77 73 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69  ows95, a.  ** si
fc00: 6e 67 6c 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65  ngle randomly se
fc10: 6c 65 63 74 65 64 20 62 79 20 66 72 6f 6d 20 74  lected by from t
fc20: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 20  he 'shared byte 
fc30: 72 61 6e 67 65 27 20 69 73 20 6c 6f 63 6b 65 64  range' is locked
fc40: 2e 0a 20 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35  ..  ** Windows95
fc50: 20 69 73 20 6e 6f 77 20 70 72 65 74 74 79 20 6d   is now pretty m
fc60: 75 63 68 20 65 78 74 69 6e 63 74 2c 20 62 75 74  uch extinct, but
fc70: 20 74 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   this work-aroun
fc80: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c  d for the.  ** l
fc90: 61 63 6b 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f  ack of shared-lo
fca0: 63 6b 73 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35  cks on Windows95
fcb0: 20 6c 69 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62   lives on, for b
fcc0: 61 63 6b 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f  ackwards.  ** co
fcd0: 6d 70 61 74 69 62 69 6c 69 74 79 2e 29 0a 20 20  mpatibility.).  
fce0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
fcf0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
fd00: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
fd10: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61  k after it has a
fd20: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20   SHARED lock..  
fd30: 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f  ** A RESERVED lo
fd40: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
fd50: 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20  d by grabbing a 
fd60: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
fd70: 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64  e.  ** 'reserved
fd80: 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20   byte'. .  **.  
fd90: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
fda0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50   only obtain a P
fdb0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65  ENDING lock afte
fdc0: 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65  r it has obtaine
fdd0: 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20  d a.  ** SHARED 
fde0: 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20  lock. A PENDING 
fdf0: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
fe00: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
fe10: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20   a write-lock.  
fe20: 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ** on the 'pendi
fe30: 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65  ng byte'. This e
fe40: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e  nsures that no n
fe50: 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ew SHARED locks 
fe60: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61  can be.  ** obta
fe70: 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69  ined, but existi
fe80: 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ng SHARED locks 
fe90: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70  are allowed to p
fea0: 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73  ersist. A proces
feb0: 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  s.  ** does not 
fec0: 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  have to obtain a
fed0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
fee0: 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50  n the way to a P
fef0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a  ENDING lock..  *
ff00: 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20  * This property 
ff10: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61  is used by the a
ff20: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c  lgorithm for rol
ff30: 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
ff40: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66  nal file.  ** af
ff50: 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a  ter a crash..  *
ff60: 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53  *.  ** An EXCLUS
ff70: 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e  IVE lock, obtain
ff80: 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49  ed after a PENDI
ff90: 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c  NG lock is held,
ffa0: 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65   is.  ** impleme
ffb0: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
ffc0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
ffd0: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68  n the entire 'sh
ffe0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
fff0: 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c  ange'. Since all
10000 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71   other locks req
10010 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  uire a read-lock
10020 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62   on one of the b
10030 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e  ytes.  ** within
10040 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69   this range, thi
10050 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
10060 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72  o other locks ar
10070 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  e held on the.  
10080 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20  ** database. .  
10090 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
100a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
100b0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
100c0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
100d0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
100e0 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
100f0 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
10100 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  tErrno = 0;..  a
10110 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
10120 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
10130 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
10140 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
10150 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
10160 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  >h,.      azFile
10170 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
10180 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
10190 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
101a0 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
101b0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
101c0 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65  FileLock), pFile
101d0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
101e0 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69  d,.      osGetpi
101f0 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  d(0)));..  /* If
10200 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
10210 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
10220 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
10230 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
10240 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
10250 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
10260 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
10270 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
10280 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
10290 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
102a0 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
102b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
102c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
102d0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
102e0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
102f0 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
10300 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
10310 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
10320 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
10330 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
10340 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10350 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
10360 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
10370 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
10380 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
10390 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
103a0 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
103b0 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
103c0 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
103d0 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
103e0 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
103f0 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
10400 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
10410 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
10420 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
10430 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
10440 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
10450 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
10460 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
10470 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
10480 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
10490 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
104a0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
104b0 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
104c0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
104d0 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
104e0 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
104f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
10500 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
10510 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
10520 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
10530 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
10540 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
10550 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
10560 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
10570 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
10580 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
10590 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
105a0 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
105b0 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
105c0 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
105d0 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
105e0 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
105f0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
10600 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
10610 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
10620 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
10630 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
10640 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
10650 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
10660 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
10670 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
10680 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
10690 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
106a0 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
106b0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
106c0 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
106d0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
106e0 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
106f0 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
10700 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
10710 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
10720 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
10730 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
10740 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
10750 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
10760 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
10770 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
10780 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
10790 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
107a0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
107b0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
107c0 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
107d0 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
107e0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
107f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
10800 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
10810 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
10820 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10830 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
10840 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
10850 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
10860 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
10870 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
10880 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
10890 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
108a0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
108b0 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
108c0 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
108d0 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
108e0 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
108f0 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
10900 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
10910 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
10920 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
10930 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
10940 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
10950 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
10960 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
10970 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
10980 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
10990 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
109a0 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
109b0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
109c0 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
109d0 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
109e0 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
109f0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
10a00 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
10a10 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
10a20 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
10a30 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
10a40 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
10a50 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
10a60 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20  File, &lock, 0) 
10a70 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
10a80 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
10a90 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
10aa0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
10ab0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
10ac0 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
10ad0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
10ae0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
10af0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
10b00 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
10b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
10b20 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
10b30 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
10b40 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
10b50 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
10b60 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
10b70 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
10b80 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
10b90 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
10ba0 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
10bb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
10bc0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
10bd0 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
10be0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
10bf0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
10c00 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
10c10 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
10c20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
10c30 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10c40 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
10c50 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
10c60 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
10c70 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
10c80 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
10c90 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
10ca0 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10cb0 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29  ile, &lock, 0) )
10cc0 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
10cd0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
10ce0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10cf0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10d00 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10d10 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a  R_LOCK);.    }..
10d20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
10d30 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
10d40 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
10d50 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
10d60 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
10d70 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
10d80 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
10d90 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
10da0 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
10db0 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30  pFile, &lock, 10
10dc0 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
10dd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
10de0 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
10df0 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
10e00 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
10e10 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
10e20 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
10e30 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
10e40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
10e50 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
10e60 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
10e70 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
10e80 20 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63   .#else.      rc
10e90 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10ea0 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a  UNLOCK; .#endif.
10eb0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
10ec0 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 49  c ){.      if( I
10ed0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
10ef0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
10f00 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
10f10 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
10f20 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  d_lock;.    }els
10f30 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
10f40 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10f50 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
10f60 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
10f70 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
10f80 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
10f90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
10fa0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
10fb0 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
10fc0 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
10fd0 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
10fe0 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
10ff0 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
11000 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
11010 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
11020 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
11030 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
11040 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
11050 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11060 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
11070 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
11080 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
11090 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
110a0 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
110b0 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
110c0 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
110d0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
110e0 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
110f0 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
11100 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11110 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
11120 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ock );.    lock.
11130 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
11140 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
11150 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
11160 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  ED_LOCK || eFile
11170 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
11180 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  LOCK );.    if( 
11190 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
111a0 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
111b0 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
111c0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
111d0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
111e0 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65   = 1L;.    }else
111f0 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
11200 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
11210 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
11220 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
11230 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IZE;.    }..    
11240 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
11250 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30  (pFile, &lock, 0
11260 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
11270 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
11280 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
11290 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
112a0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
112b0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
112c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
112d0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
112e0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
112f0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
11300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11310 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.  ..#ifdef SQL
11320 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53  ITE_DEBUG.  /* S
11330 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  et up the transa
11340 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68  ction-counter ch
11350 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c  ange checking fl
11360 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72  ags when.  ** tr
11370 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
11380 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52   a SHARED to a R
11390 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54  ESERVED lock.  T
113a0 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66  he change.  ** f
113b0 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45  rom SHARED to RE
113c0 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65  SERVED marks the
113d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
113e0 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74  normal.  ** writ
113f0 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74  e operation (not
11400 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72   a hot journal r
11410 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20  ollback)..  */. 
11420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11430 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e  OK.   && pFile->
11440 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
11450 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69  D_LOCK.   && eFi
11460 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
11470 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
11480 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
11490 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
114a0 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
114b0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
114c0 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
114d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
114e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
114f0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
11500 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
11510 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
11520 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
11530 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
11540 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
11550 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
11560 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
11570 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
11580 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
11590 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
115a0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
115b0 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  ..end_lock:.  un
115c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
115d0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
115e0 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e      %d %s %s (un
115f0 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
11600 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
11610 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
11620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
11630 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
11640 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11650 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
11660 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11670 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
11680 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
11690 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
116a0 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
116b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
116c0 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
116d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
116e0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
116f0 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
11700 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
11710 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
11720 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
11730 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65  Unused;.  p->pNe
11740 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
11750 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
11760 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
11770 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
11780 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
11790 61 74 65 64 55 6e 75 73 65 64 20 3d 20 30 3b 0a  atedUnused = 0;.
117a0 20 20 6e 55 6e 75 73 65 64 46 64 2b 2b 3b 0a 7d    nUnusedFd++;.}
117b0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
117c0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
117d0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
117e0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
117f0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
11800 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
11810 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
11820 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
11830 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
11840 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
11850 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
11860 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
11870 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
11880 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
11890 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
118a0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
118b0 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46   .** If handleNF
118c0 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c  SUnlock is true,
118d0 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61   then on downgra
118e0 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
118f0 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44  E_LOCK to SHARED
11900 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e  .** the byte ran
11910 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  ge is divided in
11920 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74  to 2 parts and t
11930 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73  he first part is
11940 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a   unlocked then.*
11950 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20  * set to a read 
11960 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f  lock, then the o
11970 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d  ther part is sim
11980 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54  ply unlocked.  T
11990 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72  his works .** ar
119a0 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53  ound a bug in BS
119b0 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73  D NFS lockd (als
119c0 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58  o seen on MacOSX
119d0 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69   10.3+) that fai
119e0 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65  ls to .** remove
119f0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
11a00 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e  on a region when
11a10 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
11a20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
11a30 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73  nt posixUnlock(s
11a40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11a50 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20   int eFileLock, 
11a60 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  int handleNFSUnl
11a70 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ock){.  unixFile
11a80 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11a90 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
11aa0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
11ab0 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
11ac0 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
11ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
11ae0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11af0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
11b00 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
11b10 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
11b20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
11b30 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
11b40 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
11b50 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
11b60 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
11b70 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
11b80 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
11b90 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
11ba0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
11bb0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
11bc0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
11bd0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
11be0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
11bf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11c00 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
11c10 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
11c20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
11c30 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
11c40 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
11c50 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11c60 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
11c70 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
11c80 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
11c90 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
11ca0 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65  leLock );..#ifde
11cb0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
11cc0 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
11cd0 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
11ce0 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
11cf0 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
11d00 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
11d10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11d20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
11d30 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
11d40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
11d50 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
11d60 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
11d70 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
11d80 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
11d90 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
11da0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
11db0 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
11dc0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
11dd0 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
11de0 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
11df0 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
11e00 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
11e10 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
11e20 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
11e30 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
11e40 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
11e50 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
11e60 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
11e70 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
11e80 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
11e90 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  */.    pFile->in
11ea0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
11eb0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
11ec0 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61  downgrading to a
11ed0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
11ee0 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65  NFS involves cle
11ef0 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20  aring the write 
11f00 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lock.    ** befo
11f10 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20  re establishing 
11f20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74  the readlock - t
11f30 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63  o avoid a race c
11f40 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e  ondition we down
11f50 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  grade.    ** the
11f60 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b   lock in 2 block
11f70 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20  s, so that part 
11f80 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c  of the range wil
11f90 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20  l be covered by 
11fa0 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  a .    ** write 
11fb0 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72  lock until the r
11fc0 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62  est is covered b
11fd0 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20  y a read lock:. 
11fe0 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57     **  1:   [WWW
11ff0 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20  WW].    **  2:  
12000 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20   [....W].    ** 
12010 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
12020 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52    **  4:   [RRRR
12030 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .].    */.    if
12040 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
12050 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69 66 20  RED_LOCK ){.#if 
12060 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45  !defined(__APPLE
12070 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45  __) || !SQLITE_E
12080 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12090 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29  YLE.      (void)
120a0 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b  handleNFSUnlock;
120b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
120c0 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d  andleNFSUnlock==
120d0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  0 );.#endif.#if 
120e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
120f0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
12100 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
12110 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64  E.      if( hand
12120 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20  leNFSUnlock ){. 
12130 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
12140 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
12150 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
12160 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rom system call 
12170 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
12180 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
12190 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
121a0 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
121b0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
121c0 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
121d0 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
121e0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
121f0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
12200 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
12210 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
12220 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
12230 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
12240 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
12250 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29  &lock, 10)==(-1)
12260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
12270 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69  rrno = errno;.#i
12280 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43  f OSLOCKING_CHEC
12290 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20  K_BUSY_IOERR.   
122a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
122b0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
122c0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
122d0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
122e0 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  K);.#else.      
122f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12300 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65  IOERR_UNLOCK;.#e
12310 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 73  ndif.          s
12320 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12330 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
12340 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
12350 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
12360 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
12370 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
12380 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
12390 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
123a0 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
123b0 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
123c0 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
123d0 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
123e0 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
123f0 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
12400 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30  pFile, &lock, 10
12410 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
12420 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
12430 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  rno;.#if OSLOCKI
12440 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
12450 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63  ERR.          rc
12460 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12470 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12480 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
12490 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65  R_RDLOCK);.#else
124a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
124b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
124c0 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  OCK;.#endif.    
124d0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
124e0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
124f0 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
12500 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
12510 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
12520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12530 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
12540 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12550 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
12560 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
12570 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
12580 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
12590 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
125a0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
125b0 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
125c0 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
125d0 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
125e0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
125f0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
12600 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28  e, &lock, 10)==(
12610 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
12620 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12630 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
12640 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
12650 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
12660 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
12670 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
12680 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
12690 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20  LOCK);.#else.   
126a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
126b0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
126c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
126d0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
126e0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
126f0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
12700 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
12710 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
12720 7d 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  }.          stor
12730 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
12740 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
12750 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
12760 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
12770 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
12780 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
12790 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
127a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
127b0 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20  G_STYLE */.     
127c0 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   {.        lock.
127d0 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
127e0 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
127f0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
12800 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
12810 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
12820 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
12830 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
12840 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
12850 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
12860 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
12870 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20 20  , 10) ){.       
12880 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
12890 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
128a0 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
128b0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
128c0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
128d0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
128e0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
128f0 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_RDLOCK);.#el
12900 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se.          /* 
12910 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
12920 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c  all to unixFileL
12930 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ock() cannot fai
12940 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  l because anothe
12950 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  r.          ** p
12960 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
12970 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  g an incompatibl
12980 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f  e lock. If it do
12990 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  es, this .      
129a0 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73      ** indicates
129b0 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
129c0 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
129d0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63  ollowing the loc
129e0 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  king.          *
129f0 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74  * protocol. If t
12a00 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74  his happens, ret
12a10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12a20 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69  _RDLOCK. Returni
12a30 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
12a40 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c  SQLITE_BUSY woul
12a50 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70  d confuse the up
12a60 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72  per layer (in pr
12a70 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73  actice it causes
12a80 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
12a90 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c  n assert to fail
12aa0 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  ). */ .         
12ab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
12ac0 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_RDLOCK;.     
12ad0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
12ae0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
12af0 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  o);.#endif.     
12b00 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
12b10 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
12b20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
12b30 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
12b40 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
12b50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
12b60 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
12b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12b80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
12b90 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
12ba0 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
12bb0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
12bc0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
12bd0 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
12be0 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
12bf0 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
12c00 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
12c10 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
12c20 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
12c30 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
12c40 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20  ck, 10)==0 ){.  
12c50 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
12c60 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
12c70 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
12c80 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
12c90 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
12ca0 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
12cb0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
12cc0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12cd0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12ce0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
12cf0 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  NLOCK);.      if
12d00 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12d10 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rc) ){.        s
12d20 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12d30 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
12d40 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
12d50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
12d60 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
12d70 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
12d80 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
12d90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 67 6f 74  #endif.      got
12da0 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
12db0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
12dc0 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
12dd0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
12de0 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
12df0 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
12e00 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
12e10 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
12e20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
12e30 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
12e40 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
12e50 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
12e60 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
12e70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
12e80 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
12e90 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
12ea0 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
12eb0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
12ec0 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
12ed0 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
12ee0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
12ef0 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
12f00 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
12f10 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
12f20 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
12f30 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a  lock, 10)==0 ){.
12f40 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
12f50 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
12f60 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OCK;.      }else
12f70 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
12f80 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
12f90 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20  .        tErrno 
12fa0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
12fb0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12fc0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12fd0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12fe0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
12ff0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
13000 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
13010 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
13020 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
13030 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
13040 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  }.#else.        
13050 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
13060 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
13070 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
13080 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
13090 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 70  #endif.        p
130a0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
130b0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
130c0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
130d0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
130e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
130f0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
13100 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63  the count of loc
13110 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  ks against this 
13120 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e  same file.  When
13130 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e   the.    ** coun
13140 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20  t reaches zero, 
13150 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20  close any other 
13160 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
13170 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20   whose close.   
13180 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64   ** was deferred
13190 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73   because of outs
131a0 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20  tanding locks.. 
131b0 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
131c0 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
131d0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
131e0 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
131f0 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
13200 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f  ==0 ){.      clo
13210 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
13220 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
13230 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e  end_unlock:.  un
13240 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
13250 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13260 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
13270 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
13280 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
13290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
132a0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
132b0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
132c0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
132d0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
132e0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
132f0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
13300 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13310 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
13320 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
13330 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
13340 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
13350 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
13360 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
13370 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
13380 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
13390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
133a0 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
133b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
133c0 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53  FileLock){.#if S
133d0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
133e0 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20  IZE>0.  assert( 
133f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
13400 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78  D_LOCK || ((unix
13410 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74  File *)id)->nFet
13420 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64  chOut==0 );.#end
13430 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  if.  return posi
13440 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
13450 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69  eLock, 0);.}..#i
13460 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
13470 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
13480 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
13490 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
134a0 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69  64 nByte);.stati
134b0 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70  c void unixUnmap
134c0 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
134d0 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  Fd);.#endif../*.
134e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
134f0 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
13500 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
13510 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
13520 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
13530 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
13540 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
13550 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
13560 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
13570 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
13580 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
13590 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
135a0 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
135b0 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
135c0 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
135d0 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
135e0 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
135f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13600 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
13610 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
13620 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
13630 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
13640 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
13650 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
13660 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
13670 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
13680 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
13690 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
136a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
136b0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20  ixFile*)id;.#if 
136c0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
136d0 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d  SIZE>0.  unixUnm
136e0 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23  apfile(pFile);.#
136f0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c  endif.  if( pFil
13700 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72  e->h>=0 ){.    r
13710 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
13720 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
13730 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
13740 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  e->h = -1;.  }.#
13750 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
13760 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29  if( pFile->pId )
13770 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  {.    if( pFile-
13780 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
13790 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a  XFILE_DELETE ){.
137a0 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70        osUnlink(p
137b0 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
137c0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
137d0 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c  }.    vxworksRel
137e0 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65  easeFileId(pFile
137f0 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c  ->pId);.    pFil
13800 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a  e->pId = 0;.  }.
13810 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
13820 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45  LITE_UNLINK_AFTE
13830 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46  R_CLOSE.  if( pF
13840 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
13850 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
13860 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b   ){.    osUnlink
13870 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  (pFile->zPath);.
13880 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13890 28 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65  (*(char**)&pFile
138a0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46  ->zPath);.    pF
138b0 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a  ile->zPath = 0;.
138c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
138d0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
138e0 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
138f0 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ));.  OpenCounte
13900 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
13910 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 50 72  _free(pFile->pPr
13920 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
13930 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  );.  memset(pFil
13940 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
13950 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72  xFile));.  retur
13960 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13970 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
13980 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
13990 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69  t unixClose(sqli
139a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
139b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
139c0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
139d0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
139e0 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65 72 69 66  le *)id;.  verif
139f0 79 44 62 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a  yDbFile(pFile);.
13a00 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
13a10 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
13a20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
13a30 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
13a40 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
13a50 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
13a60 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
13a70 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
13a80 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
13a90 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
13aa0 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
13ab0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
13ac0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
13ad0 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
13ae0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
13af0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
13b00 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65  if( ALWAYS(pFile
13b10 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69  ->pInode) && pFi
13b20 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
13b30 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
13b40 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
13b50 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
13b60 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
13b70 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
13b80 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
13b90 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
13ba0 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
13bb0 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
13bc0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
13bd0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
13be0 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
13bf0 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
13c00 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
13c10 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sed .    ** when
13c20 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
13c30 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
13c40 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
13c50 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
13c60 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
13c70 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  o(pFile);.  rc =
13c80 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
13c90 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
13ca0 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
13cb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
13cc0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
13cd0 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
13ce0 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
13cf0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
13d00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
13d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d50 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
13d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13da0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dc0 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
13dd0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
13de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13df0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
13e00 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
13e10 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
13e20 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
13e30 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
13e40 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
13e50 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
13e60 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
13e70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
13e80 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
13e90 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
13ea0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
13eb0 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
13ec0 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
13ed0 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
13ee0 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
13ef0 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
13f00 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
13f10 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
13f20 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
13f30 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
13f40 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
13f50 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
13f60 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
13f70 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
13f80 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
13f90 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
13fa0 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
13fb0 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
13fc0 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
13fd0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
13fe0 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
13ff0 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
14000 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
14010 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
14020 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
14030 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
14040 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
14050 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14060 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
14070 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
14080 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
14090 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
140a0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
140b0 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
140c0 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
140d0 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
140e0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
140f0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
14100 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
14110 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
14120 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
14130 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
14140 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
14150 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14160 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
14170 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
14180 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
14190 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
141a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
141b0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
141c0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
141d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
141e0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
141f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
14200 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
14210 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
14220 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
14230 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
14240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14250 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
14260 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
14270 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
14280 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
14290 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
142a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
142b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
142c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
142d0 29 69 64 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  )id;.  unixEnter
142e0 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70  Mutex();.  if( p
142f0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 29 7b 20  File->pInode ){ 
14300 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46   .    assert( pF
14310 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
14320 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
14330 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
14340 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock==0 );.    if
14350 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
14360 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  >nLock ){.      
14370 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
14380 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
14390 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
143a0 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
143b0 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e just.      ** 
143c0 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
143d0 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
143e0 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
143f0 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
14400 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
14410 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
14420 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
14430 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
14440 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
14450 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
14460 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
14470 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
14480 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
14490 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
144a0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  }.    releaseIno
144b0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
144c0 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55   }.  rc = closeU
144d0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75  nixFile(id);.  u
144e0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
144f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14500 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14510 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
14520 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
14530 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
14540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14550 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
14560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
145a0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
145b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
14610 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
14620 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
14650 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
14660 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
14670 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
14680 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
14690 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20  * files (really 
146a0 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20  a directory) to 
146b0 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
146c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
146d0 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f   This works.** o
146e0 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65  n just about eve
146f0 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
14700 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
14710 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
14720 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
14730 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
14740 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
14750 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
14760 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
14770 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
14780 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
14790 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
147a0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
147b0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
147c0 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
147d0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
147e0 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
147f0 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
14800 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
14810 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
14820 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
14830 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
14840 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
14850 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
14860 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
14870 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
14880 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
14890 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
148a0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
148b0 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
148c0 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
148d0 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65  eating a subdire
148e0 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d  ctory in the sam
148f0 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
14900 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
14910 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
14920 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
14930 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
14940 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
14950 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
14960 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69  lock directory i
14970 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
14980 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
14990 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70  ther.** lock typ
149a0 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
149b0 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
149c0 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
149d0 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
149e0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
149f0 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
14a00 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
14a10 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
14a20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
14a30 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f  ck directory..*/
14a40 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
14a50 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
14a60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14a70 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
14a80 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
14a90 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
14aa0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
14ab0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
14ac0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
14ad0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
14ae0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
14af0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
14b00 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
14b10 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
14b20 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
14b30 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
14b40 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
14b50 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
14b60 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
14b70 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
14b80 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
14b90 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
14ba0 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
14bb0 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
14bc0 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
14bd0 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
14be0 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
14bf0 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
14c00 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
14c10 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
14c20 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
14c30 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
14c40 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
14c50 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
14c60 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
14c70 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
14c80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14c90 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
14ca0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
14cb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
14cc0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
14cd0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14ce0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14cf0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14d00 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14d10 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14d20 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
14d30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14d40 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d   );.  reserved =
14d50 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74   osAccess((const
14d60 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
14d70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29  ckingContext, 0)
14d80 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ==0;.  OSTRACE((
14d90 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
14da0 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
14db0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
14dc0 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
14dd0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
14de0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
14df0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
14e00 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
14e10 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
14e20 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
14e30 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
14e40 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
14e50 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
14e60 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
14e70 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
14e80 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
14e90 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
14ea0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
14eb0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
14ec0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
14ed0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
14ee0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
14ef0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
14f00 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
14f10 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
14f20 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
14f30 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
14f40 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
14f50 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
14f60 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
14f70 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
14f80 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
14f90 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
14fa0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
14fb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
14fc0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
14fd0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
14fe0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
14ff0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
15000 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
15010 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
15020 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
15030 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
15040 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
15050 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
15060 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
15070 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
15080 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
15090 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
150a0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
150b0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
150c0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
150d0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
150e0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
150f0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
15100 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
15110 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
15120 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
15130 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
15140 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
15150 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
15160 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
15170 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
15180 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
15190 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
151a0 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
151b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
151c0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
151d0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
151e0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
151f0 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
15200 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
15210 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
15220 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
15230 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
15240 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
15250 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
15260 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
15270 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
15280 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
15290 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
152a0 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
152b0 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
152c0 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
152d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
152e0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
152f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15300 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
15310 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
15320 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
15330 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
15340 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
15350 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
15360 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
15370 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
15380 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
15390 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
153a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
153b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
153c0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
153d0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
153e0 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
153f0 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
15400 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
15410 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
15420 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
15430 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
15440 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
15450 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
15460 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
15470 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15480 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
15490 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
154a0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
154b0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
154c0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
154d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
154e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
154f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
15500 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
15510 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
15520 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
15530 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a  urn rc;.  } .  .
15540 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
15550 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
15560 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
15570 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15580 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
15590 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
155a0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
155b0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
155c0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
155d0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
155e0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
155f0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
15600 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
15610 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
15620 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
15630 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
15640 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
15650 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
15660 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
15670 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
15680 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
15690 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
156a0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
156b0 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
156c0 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
156d0 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
156e0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
156f0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
15700 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
15710 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
15720 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
15730 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
15740 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
15750 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
15760 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
15770 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
15780 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
15790 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
157a0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
157b0 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
157c0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
157d0 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
157e0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
157f0 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
15800 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
15810 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
15820 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
15830 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
15840 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
15850 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
15860 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
15870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15880 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
15890 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
158a0 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
158b0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
158c0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
158d0 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
158e0 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
158f0 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
15900 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
15910 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15920 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
15930 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
15940 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
15950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15960 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
15970 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
15980 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
15990 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
159a0 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
159b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
159c0 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52  CK );.  rc = osR
159d0 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  mdir(zLockFile);
159e0 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
159f0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
15a00 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74  errno;.    if( t
15a10 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b  Errno==ENOENT ){
15a20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15a30 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
15a40 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
15a50 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
15a60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15a70 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
15a80 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
15a90 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
15aa0 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  K);.#else.      
15ab0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
15ac0 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66  R_UNLOCK;.#endif
15ad0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
15ae0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
15af0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
15b00 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
15b10 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15b20 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
15b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
15b50 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
15b60 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
15b70 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
15b80 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
15b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
15ba0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
15bb0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
15bc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15bd0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15be0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
15bf0 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   );.  dotlockUnl
15c00 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
15c10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
15c20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
15c30 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72  ontext);.  retur
15c40 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
15c50 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  id);.}./********
15c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
15c70 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
15c80 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
15c90 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
15ca0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
15cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cf0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
15d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d40 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
15d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d60 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
15d70 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
15d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d90 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
15da0 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
15db0 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
15dc0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
15dd0 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
15de0 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
15df0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
15e00 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
15e10 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
15e20 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
15e30 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
15e40 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
15e50 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
15e60 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
15e70 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
15e80 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
15e90 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
15ea0 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
15eb0 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
15ec0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
15ed0 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
15ee0 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
15ef0 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
15f00 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
15f10 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
15f20 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
15f30 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
15f40 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
15f50 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
15f60 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
15f70 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
15f80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
15f90 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
15fa0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
15fb0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
15fc0 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  YLE../*.** Retry
15fd0 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
15fe0 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
15ff0 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
16000 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
16010 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
16020 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
16030 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
16040 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
16050 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
16060 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
16070 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
16080 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
16090 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
160a0 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
160b0 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
160c0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
160d0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
160e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
160f0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
16100 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
16110 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
16120 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
16130 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
16140 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
16150 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
16160 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
16170 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
16180 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
16190 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
161a0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
161b0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
161c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
161d0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
161e0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
161f0 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
16200 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
16210 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
16220 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
16230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16240 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
16250 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
16260 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16270 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
16280 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
16290 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
162a0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
162b0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
162c0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
162d0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
162e0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
162f0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
16300 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
16310 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16320 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
16330 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
16340 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
16350 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
16360 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
16370 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
16380 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
16390 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
163a0 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
163b0 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
163c0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
163d0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
163e0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
163f0 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
16400 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
16410 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
16420 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
16430 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
16440 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
16450 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
16460 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
16470 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
16480 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
16490 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
164a0 65 72 72 6f 72 20 2a 2f 0a 23 69 66 20 4f 53 4c  error */.#if OSL
164b0 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
164c0 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  Y_IOERR.        
164d0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
164e0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
164f0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
16500 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
16510 6c 73 65 20 0a 20 20 20 20 20 20 20 20 6c 72 63  lse .        lrc
16520 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
16530 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a  UNLOCK; .#endif.
16540 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
16550 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
16560 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  {.          stor
16570 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
16580 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
16590 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
165a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
165b0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
165c0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
165d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
165e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
165f0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74  else {.      int
16600 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
16610 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
16620 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f  = 1;.      /* so
16630 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74  meone else might
16640 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65   have it reserve
16650 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  d */.      lrc =
16660 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
16670 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
16680 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
16690 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66  LOCK); .      if
166a0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
166b0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
166c0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
166d0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
166e0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
166f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16700 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
16710 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
16720 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d %d (flock)\n",
16730 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
16740 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64  eserved));..#ifd
16750 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
16760 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
16770 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 30  RS.  if( (rc & 0
16780 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  xff) == SQLITE_I
16790 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
167a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
167b0 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a  reserved=1;.  }.
167c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
167d0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
167e0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a  CK_ERRORS */.  *
167f0 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
16800 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
16810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
16820 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
16830 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
16840 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
16850 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
16860 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16870 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
16880 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
16890 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
168a0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
168b0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
168c0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
168d0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
168e0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
168f0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
16900 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
16910 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
16920 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
16930 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
16940 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
16950 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
16960 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
16970 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
16980 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
16990 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
169a0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
169b0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
169c0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
169d0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
169e0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
169f0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
16a00 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
16a10 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
16a20 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
16a30 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
16a40 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
16a50 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
16a60 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
16a70 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
16a80 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
16a90 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16aa0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16ab0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
16ac0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f  LUSIVE.**.** flo
16ad0 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ck() only really
16ae0 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
16af0 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
16b00 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
16b10 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
16b20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
16b30 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
16b40 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
16b50 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
16b60 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
16b70 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
16b80 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
16b90 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
16ba0 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
16bb0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
16bc0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
16bd0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
16be0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
16bf0 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
16c00 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
16c10 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
16c20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16c30 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  flockLock(sqlite
16c40 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16c50 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
16c60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16c70 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
16c80 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16c90 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
16ca0 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
16cb0 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
16cc0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
16cd0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
16ce0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
16cf0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
16d00 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
16d10 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
16d20 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
16d30 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
16d40 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
16d50 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
16d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16d70 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
16d80 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
16d90 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73  /.  .  if (robus
16da0 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
16db0 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
16dc0 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20  _NB)) {.    int 
16dd0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
16de0 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65      /* didn't ge
16df0 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20  t, must be busy 
16e00 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
16e10 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
16e20 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
16e30 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
16e40 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
16e50 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
16e60 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
16e70 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
16e80 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  o);.    }.  } el
16e90 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20  se {.    /* got 
16ea0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
16eb0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
16ec0 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  /.    pFile->eFi
16ed0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16ee0 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  ck;.  }.  OSTRAC
16ef0 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16f00 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  s %s (flock)\n",
16f10 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
16f20 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16f30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63  , .           rc
16f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
16f50 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
16f60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
16f70 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
16f80 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
16f90 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c  c & 0xff) == SQL
16fa0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
16fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16fc0 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  Y;.  }.#endif /*
16fd0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
16fe0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
16ff0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
17000 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
17010 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
17020 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
17030 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
17040 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
17050 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
17060 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
17070 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
17080 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
17090 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
170a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
170b0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
170c0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
170d0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
170e0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
170f0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
17110 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
17120 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17130 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
17140 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
17150 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
17160 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
17170 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
17180 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
17190 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
171a0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
171b0 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
171c0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
171d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47  ->eFileLock, osG
171e0 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73  etpid(0)));.  as
171f0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
17200 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17210 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
17220 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
17230 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17240 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
17250 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17260 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
17270 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
17280 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
17290 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
172a0 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
172b0 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
172c0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
172d0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
172e0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
172f0 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
17300 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17310 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
17320 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
17330 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f( robust_flock(
17340 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
17350 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  N) ){.#ifdef SQL
17360 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
17370 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
17380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17390 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  K;.#endif /* SQL
173a0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
173b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
173c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
173d0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
173e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
173f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17400 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  NO_LOCK;.    ret
17410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17420 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
17430 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
17440 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f  tic int flockClo
17450 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
17460 2a 69 64 29 20 7b 0a 20 20 61 73 73 65 72 74 28  *id) {.  assert(
17470 20 69 64 21 3d 30 20 29 3b 0a 20 20 66 6c 6f 63   id!=0 );.  floc
17480 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
17490 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  OCK);.  return c
174a0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
174b0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
174c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
174d0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
174e0 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a  S_VXWORK */../**
174f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17500 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f  * End of the flo
17510 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ck lock implemen
17520 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
17530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
17540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
17590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
175e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175f0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d  ****** Begin Nam
17600 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63  ed Semaphore Loc
17610 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
17620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
17630 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
17640 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
17650 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  nly supported on
17660 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20   VxWorks..**.** 
17670 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  Semaphore lockin
17680 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f  g is like dot-lo
17690 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20  ck and flock in 
176a0 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f  that it really o
176b0 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  nly.** supports 
176c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e  EXCLUSIVE lockin
176d0 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c  g.  Only a singl
176e0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65  e process can re
176f0 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74  ad or write.** t
17700 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17710 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
17720 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74  s reduces potent
17730 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c  ial concurrency,
17740 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68   but.** makes th
17750 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
17760 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65  ation much easie
17770 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  r..*/.#if OS_VXW
17780 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
17790 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
177a0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
177b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
177c0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
177d0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
177e0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
177f0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
17800 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
17810 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
17820 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
17830 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
17840 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
17850 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
17860 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
17870 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
17880 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
17890 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
178a0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
178b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
178c0 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65 64  emXCheckReserved
178d0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
178e0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
178f0 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
17900 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17910 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
17920 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
17930 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
17940 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
17950 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
17960 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
17970 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
17980 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
17990 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
179a0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
179b0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
179c0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
179d0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
179e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
179f0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
17a00 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
17a10 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
17a20 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
17a30 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
17a40 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
17a50 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
17a60 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
17a70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
17a80 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d  em;..    if( sem
17a90 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
17aa0 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  -1 ){.      int 
17ab0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
17ac0 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e        if( EAGAIN
17ad0 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   != tErrno ){.  
17ae0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17af0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
17b00 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
17b10 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
17b20 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20  ESERVEDLOCK);.  
17b30 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
17b40 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
17b50 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  no);.      } els
17b60 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
17b70 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
17b80 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
17b90 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
17ba0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
17bb0 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46  ved = (pFile->eF
17bc0 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44  ileLock < SHARED
17bd0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
17be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17bf0 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76   /* we could hav
17c00 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
17c10 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f  it */.      sem_
17c20 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20  post(pSem);.    
17c30 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
17c40 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
17c50 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22  d %d %d (sem)\n"
17c60 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
17c70 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
17c80 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
17c90 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
17ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
17cb0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
17cc0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
17cd0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
17ce0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
17cf0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
17d00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
17d10 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
17d20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
17d30 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
17d40 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
17d50 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
17d60 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
17d70 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
17d80 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
17d90 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
17da0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
17db0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
17dc0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
17dd0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
17de0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
17df0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
17e00 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
17e10 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
17e20 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
17e30 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
17e40 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
17e50 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
17e60 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
17e70 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
17e80 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
17e90 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
17ea0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
17eb0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
17ec0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
17ed0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
17ee0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
17ef0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
17f00 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
17f10 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
17f20 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
17f30 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
17f40 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
17f50 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d  LUSIVE.**.** Sem
17f60 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c  aphore locks onl
17f70 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
17f80 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
17f90 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
17fa0 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
17fb0 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
17fc0 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
17fd0 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
17fe0 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
17ff0 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
18000 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
18010 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
18020 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
18030 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
18040 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
18050 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
18060 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
18070 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
18080 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
18090 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
180a0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
180b0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
180c0 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f 63 6b  tic int semXLock
180d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
180e0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
180f0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
18100 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
18110 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  e*)id;.  sem_t *
18120 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
18130 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e  node->pSem;.  in
18140 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18150 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
18160 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
18170 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
18180 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
18190 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
181a0 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
181b0 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
181c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
181d0 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
181e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
181f0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
18200 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
18210 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
18220 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
18230 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68    /* lock semaph
18240 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c  ore now but bail
18250 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64   out when alread
18260 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69  y locked. */.  i
18270 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
18280 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
18290 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
182a0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
182b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
182c0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
182d0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
182e0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
182f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
18300 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65  ileLock;.. sem_e
18310 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72  nd_lock:.  retur
18320 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
18330 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
18340 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
18350 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
18360 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
18370 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
18380 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
18390 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
183a0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
183b0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
183c0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
183d0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
183e0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
183f0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
18400 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
18410 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
18420 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
18430 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 73 71  nt semXUnlock(sq
18440 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18450 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
18460 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
18470 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
18480 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  id;.  sem_t *pSe
18490 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
184a0 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65  e->pSem;..  asse
184b0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
184c0 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20  ssert( pSem );. 
184d0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
184e0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
184f0 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c  pid=%d (sem)\n",
18500 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
18510 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
18520 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18530 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
18540 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
18550 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
18560 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
18570 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
18580 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
18590 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
185a0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
185b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
185c0 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
185d0 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
185e0 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
185f0 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
18600 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
18610 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18620 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
18630 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
18640 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
18650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18660 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
18670 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a  really unlock. *
18680 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73  /.  if ( sem_pos
18690 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a  t(pSem)==-1 ) {.
186a0 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
186b0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
186c0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
186d0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
186e0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
186f0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
18700 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
18710 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
18720 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
18730 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
18740 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
18750 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
18760 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
18770 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
18780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18790 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
187a0 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
187b0 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71 6c 69  t semXClose(sqli
187c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
187d0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
187e0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
187f0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
18800 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 28  .    semXUnlock(
18810 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
18820 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
18830 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
18840 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
18850 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
18860 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
18870 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
18880 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
18890 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
188a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
188b0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
188c0 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
188d0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
188e0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
188f0 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
18900 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
18910 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18920 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
18930 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
18940 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
18950 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
18960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189a0 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
189b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a10 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
18a20 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
18a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a40 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
18a50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
18a60 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
18a70 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
18a80 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
18a90 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
18aa0 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
18ab0 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
18ac0 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
18ad0 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
18ae0 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
18af0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
18b00 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
18b10 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
18b20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
18b30 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
18b40 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
18b50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
18b60 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
18b70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
18b80 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
18b90 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
18ba0 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
18bb0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
18bc0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
18bd0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
18be0 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
18bf0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
18c00 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
18c10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
18c20 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
18c30 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18c40 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
18c50 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
18c60 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
18c70 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
18c80 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
18c90 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
18ca0 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
18cb0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
18cc0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
18cd0 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
18ce0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
18cf0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
18d00 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
18d10 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
18d20 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
18d30 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
18d40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
18d50 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
18d60 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
18d70 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
18d80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
18d90 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
18da0 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
18db0 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
18dc0 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
18dd0 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
18e00 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
18e10 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
18e20 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
18e30 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
18e40 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
18e50 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
18e60 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
18e70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
18e80 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
18e90 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
18ea0 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
18eb0 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
18ec0 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
18ed0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18ee0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
18ef0 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
18f00 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
18f10 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
18f20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
18f30 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
18f40 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
18f50 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
18f60 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
18f70 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18f80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18f90 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
18fa0 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
18fb0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
18fc0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
18fd0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
18fe0 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
18ff0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
19000 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
19010 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19020 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
19030 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
19040 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
19050 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
19060 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
19070 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
19080 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
19090 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
190a0 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
190b0 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
190c0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
190d0 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
190e0 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
190f0 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
19100 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
19110 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
19120 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
19130 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
19140 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
19150 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
19160 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
19170 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
19180 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
19190 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
191a0 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
191b0 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
191c0 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
191d0 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
191e0 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
191f0 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
19200 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
19210 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
19220 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
19230 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
19240 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
19250 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
19260 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
19270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
19280 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
19290 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
192a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
192b0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
192c0 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
192d0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
192e0 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
192f0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
19300 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
19330 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
19340 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
19350 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
19360 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
19370 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
19380 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
19390 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
193a0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
193b0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
193c0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
193d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
193e0 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
193f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19400 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
19410 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
19420 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
19430 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
19440 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
19450 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
19460 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
19470 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
19480 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
19490 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
194a0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
194b0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
194c0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
194d0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
194e0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
194f0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
19500 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
19510 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
19520 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
19530 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
19540 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
19550 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19560 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
19570 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19580 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
19590 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
195a0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
195b0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
195c0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
195d0 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a  xt *context;.  .
195e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
195f0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
19600 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
19610 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
19620 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
19630 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28  );.  context = (
19640 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
19650 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
19660 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66  ingContext;.  if
19670 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  ( context->reser
19680 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ved ){.    *pRes
19690 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Out = 1;.    ret
196a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
196b0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
196c0 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
196d0 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
196e0 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
196f0 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20   threads */.  . 
19700 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
19710 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
19720 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
19730 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
19740 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
19750 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
19760 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
19770 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
19780 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
19790 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
197a0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
197b0 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28   it..   */.  if(
197c0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
197d0 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45    /* lock the RE
197e0 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20  SERVED byte */. 
197f0 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70     int lrc = afp
19800 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
19810 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
19820 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
19830 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53  ,1);  .    if( S
19840 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b  QLITE_OK==lrc ){
19850 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
19860 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b  succeeded in tak
19870 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64  ing the reserved
19880 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
19890 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20   to restore.    
198a0 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
198b0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20  l state */.     
198c0 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
198d0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
198e0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
198f0 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
19900 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
19910 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c     /* if we fail
19920 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  ed to get the lo
19930 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20  ck then someone 
19940 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69  else must have i
19950 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72  t */.      reser
19960 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
19970 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
19980 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
19990 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d     rc=lrc;.    }
199a0 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
199b0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
199c0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
199d0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61  LOCK %d %d %d (a
199e0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
199f0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
19a00 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20  ;.  .  *pResOut 
19a10 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
19a20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19a30 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
19a40 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
19a50 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
19a60 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
19a70 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
19a80 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
19a90 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
19aa0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
19ab0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
19ac0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
19ad0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
19ae0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
19af0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
19b00 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
19b10 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
19b20 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
19b30 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
19b40 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
19b50 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
19b60 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
19b70 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
19b80 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
19b90 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
19ba0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
19bb0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
19bc0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
19bd0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
19be0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
19bf0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
19c00 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
19c10 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19c20 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
19c30 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
19c40 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
19c50 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
19c60 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
19c70 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
19c80 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
19c90 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
19ca0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
19cb0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
19cc0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
19cd0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
19ce0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19cf0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
19d00 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
19d10 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
19d20 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
19d30 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
19d40 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
19d50 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f  static int afpLo
19d60 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
19d70 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
19d80 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
19d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
19da0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
19db0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
19dc0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
19dd0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
19de0 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b  Inode;.  afpLock
19df0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
19e00 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
19e10 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
19e20 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
19e30 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
19e40 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
19e50 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
19e60 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
19e70 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
19e80 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
19e90 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
19ea0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
19eb0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
19ec0 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
19ed0 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
19ee0 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  k(pInode->eFileL
19ef0 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53  ock), pInode->nS
19f00 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70 69 64  hared , osGetpid
19f10 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (0)));..  /* If 
19f20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
19f30 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
19f40 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
19f50 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
19f60 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
19f70 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
19f80 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
19f90 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
19fa0 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
19fb0 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
19fc0 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
19fd0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
19fe0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
19ff0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
1a000 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
1a010 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
1a020 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29  eady held) (afp)
1a030 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
1a040 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
1a050 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
1a060 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1a070 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
1a080 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1a090 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
1a0a0 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
1a0b0 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
1a0c0 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
1a0d0 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
1a0e0 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
1a0f0 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
1a100 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
1a110 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
1a120 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
1a130 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
1a140 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
1a150 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
1a160 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
1a170 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
1a180 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1a190 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
1a1a0 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
1a1b0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
1a1c0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
1a1d0 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
1a1e0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
1a1f0 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
1a200 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
1a210 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
1a220 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
1a230 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
1a240 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
1a250 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
1a260 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
1a270 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
1a280 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1a290 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
1a2a0 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
1a2b0 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
1a2c0 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
1a2d0 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
1a2e0 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
1a2f0 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
1a300 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
1a310 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1a320 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
1a330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
1a340 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
1a350 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1a360 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e   && .       (pIn
1a370 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
1a380 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
1a390 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
1a3a0 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a  _LOCK)).     ){.
1a3b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a3c0 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61  BUSY;.    goto a
1a3d0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
1a3e0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48  .  .  /* If a SH
1a3f0 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
1a400 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
1a410 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
1a420 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
1a430 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
1a440 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
1a450 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
1a460 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
1a470 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
1a480 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
1a490 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
1a4a0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a4b0 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65  && .     (pInode
1a4c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
1a4d0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
1a4e0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
1a4f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
1a500 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
1a510 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
1a520 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
1a530 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
1a540 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
1a550 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
1a560 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
1a570 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1a580 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
1a590 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
1a5a0 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
1a5b0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
1a5c0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
1a5d0 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
1a5e0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
1a5f0 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
1a600 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
1a610 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
1a620 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
1a630 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
1a640 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
1a650 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
1a660 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
1a670 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
1a680 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
1a690 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a6a0 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
1a6b0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
1a6c0 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
1a6d0 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
1a6e0 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
1a6f0 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  int failed;.    
1a700 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
1a710 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1a720 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
1a730 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
1a740 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
1a750 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
1a760 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
1a770 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
1a780 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
1a790 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
1a7a0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
1a7b0 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
1a7c0 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
1a7d0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
1a7e0 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
1a7f0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
1a800 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
1a810 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
1a820 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
1a830 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
1a840 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  1Errno = 0;.    
1a850 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20  long lk, mask;. 
1a860 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
1a870 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
1a880 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1a890 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
1a8a0 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
1a8b0 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73    .    mask = (s
1a8c0 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20  izeof(long)==8) 
1a8d0 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ? LARGEST_INT64 
1a8e0 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  : 0x7fffffff;.  
1a8f0 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
1a900 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
1a910 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
1a920 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
1a930 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
1a940 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
1a950 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
1a960 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
1a970 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e  ndom(); .    pIn
1a980 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20  ode->sharedByte 
1a990 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53  = (lk & mask)%(S
1a9a0 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
1a9b0 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53  .    lrc1 = afpS
1a9c0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1a9d0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
1a9e0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
1a9f0 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
1aa00 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
1aa10 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
1aa20 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
1aa30 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
1aa40 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
1aa50 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
1aa60 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
1aa70 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
1aa80 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
1aa90 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
1aaa0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
1aab0 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
1aac0 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
1aad0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
1aae0 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
1aaf0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1ab00 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45 72 72  o(pFile, lrc1Err
1ab10 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
1ab20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc1;.      goto
1ab30 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
1ab40 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53     } else if( IS
1ab50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32  _LOCK_ERROR(lrc2
1ab60 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1ab70 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc2;.      goto
1ab80 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
1ab90 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72     } else if( lr
1aba0 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  c1 != SQLITE_OK 
1abb0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  ) {.      rc = l
1abc0 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rc1;.    } else 
1abd0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
1abe0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
1abf0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
1ac00 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
1ac10 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
1ac20 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
1ac30 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
1ac40 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
1ac50 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
1ac60 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
1ac70 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
1ac80 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
1ac90 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
1aca0 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
1acb0 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65  his.     ** same
1acc0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
1acd0 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
1ace0 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
1acf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1ad00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1ad10 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
1ad20 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
1ad30 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
1ad40 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
1ad50 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
1ad60 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
1ad70 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
1ad80 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
1ad90 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
1ada0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
1adb0 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ed = 0;.    asse
1adc0 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46  rt( 0!=pFile->eF
1add0 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69  ileLock );.    i
1ade0 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20  f (eFileLock >= 
1adf0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
1ae00 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1ae10 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  k < RESERVED_LOC
1ae20 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
1ae30 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
1ae40 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
1ae50 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
1ae60 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1ae70 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
1ae80 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
1ae90 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66  1);.      if( !f
1aea0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
1aeb0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
1aec0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
1aed0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66      }.    if (!f
1aee0 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f  ailed && eFileLo
1aef0 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f  ck == EXCLUSIVE_
1af00 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a  LOCK) {.      /*
1af10 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
1af20 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20  USIVE lock */.  
1af30 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
1af40 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65  Remove the share
1af50 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72  d lock before tr
1af60 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20  ying the range. 
1af70 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a   we'll need to .
1af80 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62        ** reestab
1af90 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
1afa0 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74  lock if we can't
1afb0 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c   get the  afpUnl
1afc0 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ock.      */.   
1afd0 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20     if( !(failed 
1afe0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1aff0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1b000 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
1b010 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  T +.            
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
1b030 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
1b040 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20   1, 0)) ){.     
1b050 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d     int failed2 =
1b060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b070 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
1b080 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
1b090 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
1b0a0 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
1b0b0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
1b0c0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1b0d0 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
1b0e0 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20  D_FIRST, .      
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
1b110 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20  SIZE, 1);.      
1b120 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20    if( failed && 
1b130 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65  (failed2 = afpSe
1b140 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
1b150 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
1b180 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61  ST + pInode->sha
1b190 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20  redByte, 1, 1)) 
1b1a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b1b0 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73  Can't reestablis
1b1c0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
1b1d0 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74  k.  Sqlite can't
1b1e0 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20   deal, this is. 
1b1f0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72           ** a cr
1b200 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72  itical I/O error
1b210 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1b220 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66          rc = ((f
1b230 61 69 6c 65 64 20 26 20 30 78 66 66 29 20 3d 3d  ailed & 0xff) ==
1b240 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f   SQLITE_IOERR) ?
1b250 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20   failed2 : .    
1b260 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1b270 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
1b280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70          goto afp
1b290 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20  _end_lock;.     
1b2a0 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73     } .      }els
1b2b0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1b2c0 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d  failed; .      }
1b2d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
1b2e0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
1b2f0 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
1b300 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  }.  }.  .  if( r
1b310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b320 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
1b330 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
1b340 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
1b350 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
1b360 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
1b370 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
1b380 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
1b390 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
1b3a0 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
1b3b0 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
1b3c0 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
1b3d0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a  NG_LOCK;.  }.  .
1b3e0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  afp_end_lock:.  
1b3f0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1b400 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
1b410 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
1b420 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
1b430 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
1b440 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
1b450 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
1b460 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
1b470 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
1b480 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
1b490 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
1b4a0 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
1b4b0 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
1b4c0 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
1b4d0 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
1b4e0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
1b4f0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
1b500 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
1b510 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
1b520 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1b530 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
1b540 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
1b550 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
1b560 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
1b570 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1b580 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1b590 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   afpUnlock(sqlit
1b5a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1b5b0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
1b5c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b5d0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
1b5e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1b5f0 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
1b600 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
1b610 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
1b620 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
1b630 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
1b640 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
1b650 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
1b660 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30  t skipShared = 0
1b670 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1b680 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70  TEST.  int h = p
1b690 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a  File->h;.#endif.
1b6a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1b6b0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1b6c0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
1b6d0 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
1b6e0 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
1b6f0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
1b700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1b710 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
1b720 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
1b730 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
1b740 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
1b750 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1b760 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73  tpid(0)));..  as
1b770 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
1b780 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1b790 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
1b7a0 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
1b7b0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
1b7c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1b7d0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1b7e0 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
1b7f0 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
1b800 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
1b810 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
1b820 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
1b830 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
1b840 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b850 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1b860 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
1b870 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  ck );.    Simula
1b880 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1b890 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  1);.    Simulate
1b8a0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
1b8b0 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ).    SimulateIO
1b8c0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1b8d0 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
1b8e0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1b8f0 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
1b900 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
1b910 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
1b920 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
1b930 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
1b940 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
1b950 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1b960 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1b970 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1b980 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
1b990 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
1b9a0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
1b9b0 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
1b9c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b9d0 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
1b9e0 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
1b9f0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
1ba00 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
1ba10 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
1ba20 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
1ba30 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
1ba40 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
1ba50 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
1ba60 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
1ba70 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
1ba80 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
1ba90 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
1baa0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1bab0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1bac0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1bad0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30  inNormalWrite==0
1bae0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
1baf0 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
1bb00 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
1bb10 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1bb20 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Chng==1 );.    p
1bb30 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
1bb40 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
1bb50 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69      .    if( pFi
1bb60 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  le->eFileLock==E
1bb70 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
1bb80 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
1bb90 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1bba0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
1bbb0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41  HARED_FIRST, SHA
1bbc0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
1bbd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bbe0 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c  TE_OK && (eFileL
1bbf0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
1bc00 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   || pInode->nSha
1bc10 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  red>1) ){.      
1bc20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74    /* only re-est
1bc30 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
1bc40 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73  d lock if necess
1bc50 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ary */.        i
1bc60 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  nt sharedLockByt
1bc70 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
1bc80 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
1bc90 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
1bca0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1bcb0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1bcc0 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
1bcd0 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
1bce0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1bcf0 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20     skipShared = 
1bd00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1bd10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bd20 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
1bd30 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
1bd40 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
1bd50 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
1bd60 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1bd70 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
1bd80 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
1bd90 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63     } .    if( rc
1bda0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1bdb0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
1bdc0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
1bdd0 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  & context->reser
1bde0 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ved ){.      rc 
1bdf0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1be00 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1be10 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
1be20 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  TE, 1, 0);.     
1be30 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20   if( !rc ){ .   
1be40 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
1be50 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20  served = 0; .   
1be60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1be70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1be80 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
1be90 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1bea0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
1beb0 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  )){.      pInode
1bec0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
1bed0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
1bee0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1bef0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c  QLITE_OK && eFil
1bf00 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
1bf10 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  {..    /* Decrem
1bf20 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
1bf30 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
1bf40 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
1bf50 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
1bf60 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
1bf70 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
1bf80 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
1bf90 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
1bfa0 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
1bfb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69  .    */.    unsi
1bfc0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
1bfd0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
1bfe0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
1bff0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
1c000 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
1c010 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
1c020 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
1c030 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75  =0 ){.      Simu
1c040 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1c050 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
1c060 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
1c070 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
1c080 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1c090 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
1c0a0 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20  !skipShared ){. 
1c0b0 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
1c0c0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1c0d0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
1c0e0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
1c0f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1c100 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
1c110 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
1c120 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
1c130 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
1c140 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
1c150 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
1c160 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1c170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c180 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
1c190 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65  ck--;.      asse
1c1a0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
1c1b0 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  k>=0 );.      if
1c1c0 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
1c1d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
1c1e0 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
1c1f0 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
1c200 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
1c210 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
1c220 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c230 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
1c240 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
1c250 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
1c260 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1c270 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
1c280 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
1c290 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
1c2a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
1c2b0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
1c2c0 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
1c2d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c2e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1c2f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1c300 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ;.  assert( id!=
1c310 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f 63 6b  0 );.  afpUnlock
1c320 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
1c330 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1c340 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1c350 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d  pInode && pFile-
1c360 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
1c370 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1c380 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
1c390 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
1c3a0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
1c3b0 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
1c3c0 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
1c3d0 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
1c3e0 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
1c3f0 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
1c400 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
1c410 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
1c420 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
1c430 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
1c440 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
1c450 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73  n.    ** the las
1c460 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
1c470 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
1c480 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
1c490 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
1c4a0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
1c4b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1c4c0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
1c4d0 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20 3d 20  ontext);.  rc = 
1c4e0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
1c4f0 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
1c500 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
1c510 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
1c520 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1c530 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
1c540 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1c550 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
1c560 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
1c570 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
1c580 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
1c590 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
1c5a0 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
1c5b0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
1c5c0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
1c5d0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
1c5e0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
1c5f0 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
1c600 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
1c610 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
1c620 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
1c630 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
1c640 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
1c650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c660 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
1c670 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1c680 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
1c690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1c6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
1c6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1c740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c750 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
1c760 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
1c770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
1c790 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1c7a0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
1c7b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1c7c0 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
1c7d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
1c7e0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
1c7f0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
1c800 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
1c810 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20  ock. ** must be 
1c820 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
1c830 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20  r SHARED_LOCK.. 
1c840 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f  **. ** If the lo
1c850 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
1c860 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1c870 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
1c880 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68   or below. ** th
1c890 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
1c8a0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
1c8b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1c8c0 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  op.. */.static i
1c8d0 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c  nt nfsUnlock(sql
1c8e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1c8f0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
1c900 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
1c910 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
1c920 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  k, 1);.}..#endif
1c930 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
1c940 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1c950 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1c960 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
1c970 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
1c980 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
1c990 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
1c9a0 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
1c9b0 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
1c9c0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
1c9d0 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
1c9e0 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
1c9f0 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
1ca00 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a  s available.  .*
1ca10 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1ca20 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
1ca30 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
1ca40 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
1ca50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1ca70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1caa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cab0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
1cac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1caf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb00 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1cb10 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20  *** Non-locking 
1cb20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1cb30 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1cb40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb50 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  **.**.** The nex
1cb60 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  t division conta
1cb70 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ins implementati
1cb80 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68  ons for all meth
1cb90 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ods of the .** s
1cba0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
1cbb0 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ct other than th
1cbc0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
1cbd0 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  s.  The locking.
1cbe0 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20  ** methods were 
1cbf0 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73  defined in divis
1cc00 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20  ions above (one 
1cc10 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70  locking method p
1cc20 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e  er.** division).
1cc30 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20    Those methods 
1cc40 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20  that are common 
1cc50 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d  to all locking m
1cc60 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68  odes.** are gath
1cc70 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  er together into
1cc80 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a   this division..
1cc90 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  */../*.** Seek t
1cca0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
1ccb0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1ccc0 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
1ccd0 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
1cce0 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
1ccf0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1cd00 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
1cd10 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
1cd20 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
1cd30 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
1cd40 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
1cd50 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
1cd60 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
1cd70 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
1cd80 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
1cd90 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
1cda0 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
1cdb0 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
1cdc0 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
1cdd0 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
1cde0 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20  PREAD.** in any 
1cdf0 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
1ce00 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
1ce10 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
1ce20 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
1ce30 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
1ce40 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
1ce50 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1ce60 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1ce70 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1ce80 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
1ce90 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
1cea0 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
1ceb0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1cec0 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
1ced0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
1cee0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1cef0 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
1cf00 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
1cf10 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f   got;.  int prio
1cf20 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66  r = 0;.#if (!def
1cf30 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
1cf40 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
1cf50 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
1cf60 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
1cf70 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  f.  TIMER_START;
1cf80 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
1cf90 28 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b  (cnt&0x1ffff) );
1cfa0 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68  .  assert( id->h
1cfb0 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69 66 20  >2 );.  do{.#if 
1cfc0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1cfd0 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50  D).    got = osP
1cfe0 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
1cff0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
1d000 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1d010 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
1d020 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
1d030 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20  SE_PREAD64).    
1d040 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28  got = osPread64(
1d050 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
1d060 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53  , offset);.    S
1d070 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1d080 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73  got = -1 );.#els
1d090 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20  e.    newOffset 
1d0a0 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
1d0b0 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
1d0c0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1d0d0 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74  Error( newOffset
1d0e0 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28   = -1 );.    if(
1d0f0 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29 7b 0a   newOffset<0 ){.
1d100 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1d110 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1d120 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  id, errno);.    
1d130 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1d140 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52   }.    got = osR
1d150 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
1d160 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
1d170 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29    if( got==cnt )
1d180 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
1d190 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  got<0 ){.      i
1d1a0 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  f( errno==EINTR 
1d1b0 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74  ){ got = 1; cont
1d1c0 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72  inue; }.      pr
1d1d0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ior = 0;.      s
1d1e0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
1d1f0 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20 65 72  nixFile*)id,  er
1d200 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rno);.      brea
1d210 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
1d220 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20 20   got>0 ){.      
1d230 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20  cnt -= got;.    
1d240 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b    offset += got;
1d250 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d 20  .      prior += 
1d260 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66 20  got;.      pBuf 
1d270 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20  = (void*)(got + 
1d280 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20 20  (char*)pBuf);.  
1d290 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f    }.  }while( go
1d2a0 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45  t>0 );.  TIMER_E
1d2b0 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ND;.  OSTRACE(("
1d2c0 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
1d2d0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a   %7lld %llu\n",.
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e              id->
1d2f0 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66  h, got+prior, of
1d300 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45  fset-prior, TIME
1d310 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72  R_ELAPSED));.  r
1d320 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b  eturn got+prior;
1d330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1d340 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
1d350 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
1d360 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1d370 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
1d380 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
1d390 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
1d3a0 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
1d3b0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1d3c0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1d3d0 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71  t unixRead(.  sq
1d3e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1d3f0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  .  void *pBuf, .
1d400 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
1d410 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
1d420 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t.){.  unixFile 
1d430 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1d440 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67  le *)id;.  int g
1d450 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ot;.  assert( id
1d460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
1d470 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  fset>=0 );.  ass
1d480 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20  ert( amt>0 );.. 
1d490 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1d4a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1d4b0 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
1d4c0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
1d4d0 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
1d4e0 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
1d4f0 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
1d500 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
1d510 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1d520 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  . */.#if 0.  ass
1d530 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50 72 65  ert( pFile->pPre
1d540 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 3d  allocatedUnused=
1d550 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
1d560 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
1d570 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
1d580 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
1d590 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
1d5a0 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1d5b0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1d5c0 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
1d5d0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
1d5e0 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
1d5f0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
1d600 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
1d610 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
1d620 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
1d630 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
1d640 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
1d650 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1d660 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
1d670 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
1d680 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
1d690 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
1d6a0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1d6b0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1d6c0 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
1d6d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d6e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d6f0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
1d700 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
1d710 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
1d720 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
1d730 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1d740 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e  ion))[offset], n
1d750 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
1d760 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
1d770 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
1d780 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
1d790 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
1d7a0 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
1d7b0 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73  endif..  got = s
1d7c0 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1d7d0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1d7e0 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
1d7f0 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
1d800 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d810 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
1d820 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
1d830 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1d840 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
1d850 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1d860 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
1d870 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1d880 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 20  rno(pFile, 0);  
1d890 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
1d8a0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a   error */.    /*
1d8b0 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
1d8c0 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
1d8d0 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
1d8e0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
1d8f0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74  (char*)pBuf)[got
1d900 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a  ], 0, amt-got);.
1d910 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d920 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1d930 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  AD;.  }.}../*.**
1d940 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65 6b   Attempt to seek
1d950 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72 69   the file-descri
1d960 70 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ptor passed as t
1d970 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1d980 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65  t to.** absolute
1d990 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74 68   offset iOff, th
1d9a0 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  en attempt to wr
1d9b0 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
1d9c0 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70  f data from.** p
1d9d0 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61 6e  Buf to it. If an
1d9e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
1d9f0 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65 74  eturn -1 and set
1da00 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72   *piErrno. Other
1da10 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  wise, .** return
1da20 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62   the actual numb
1da30 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
1da40 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20 62  ten (which may b
1da50 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e  e less than.** n
1da60 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Buf)..*/.static 
1da70 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1da80 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20  Fd(.  int fd,   
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
1dab0 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69 74  scriptor to writ
1dac0 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f  e to */.  i64 iO
1dad0 66 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ff,             
1dae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1daf0 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69  e offset to begi
1db00 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
1db10 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
1db20 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1db30 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1db40 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72 20  rom this buffer 
1db50 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  to the file */. 
1db60 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20   int nBuf,      
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
1db90 65 72 20 70 42 75 66 20 69 6e 20 62 79 74 65 73  er pBuf in bytes
1dba0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72 72   */.  int *piErr
1dbb0 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
1dbc0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
1dbd0 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65 72  ror number if er
1dbe0 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b  ror occurs */.){
1dbf0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1dc20 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20 63  rned by system c
1dc30 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  all */..  assert
1dc40 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30 78  ( nBuf==(nBuf&0x
1dc50 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65  1ffff) );.  asse
1dc60 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 61 73  rt( fd>2 );.  as
1dc70 73 65 72 74 28 20 70 69 45 72 72 6e 6f 21 3d 30  sert( piErrno!=0
1dc80 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78   );.  nBuf &= 0x
1dc90 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53  1ffff;.  TIMER_S
1dca0 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e  TART;..#if defin
1dcb0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
1dcc0 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73  do{ rc = (int)os
1dcd0 50 77 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c  Pwrite(fd, pBuf,
1dce0 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77   nBuf, iOff); }w
1dcf0 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1dd00 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
1dd10 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
1dd20 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72  PREAD64).  do{ r
1dd30 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74  c = (int)osPwrit
1dd40 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42  e64(fd, pBuf, nB
1dd50 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65  uf, iOff);}while
1dd60 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
1dd70 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20  =EINTR);.#else. 
1dd80 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65   do{.    i64 iSe
1dd90 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69  ek = lseek(fd, i
1dda0 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  Off, SEEK_SET);.
1ddb0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1ddc0 72 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d 31 20  ror( iSeek = -1 
1ddd0 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b  );.    if( iSeek
1dde0 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
1ddf0 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
1de00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1de10 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75   osWrite(fd, pBu
1de20 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69  f, nBuf);.  }whi
1de30 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1de40 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64  o==EINTR );.#end
1de50 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  if..  TIMER_END;
1de60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
1de70 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
1de80 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c  lld %llu\n", fd,
1de90 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52   rc, iOff, TIMER
1dea0 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69  _ELAPSED));..  i
1deb0 66 28 20 72 63 3c 30 20 29 20 2a 70 69 45 72 72  f( rc<0 ) *piErr
1dec0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65  no = errno;.  re
1ded0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1dee0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1def0 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
1df00 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
1df10 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
1df20 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
1df30 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1df40 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
1df50 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
1df60 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
1df70 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
1df80 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
1df90 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
1dfa0 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
1dfb0 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
1dfc0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1dfd0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1dfe0 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
1dff0 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
1e000 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
1e010 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
1e020 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57   return seekAndW
1e030 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66  riteFd(id->h, of
1e040 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c  fset, pBuf, cnt,
1e050 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29   &id->lastErrno)
1e060 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
1e070 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
1e080 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
1e090 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1e0a0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
1e0b0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
1e0c0 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
1e0d0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1e0e0 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
1e0f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1e100 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
1e110 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1e120 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1e130 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
1e140 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1e150 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1e160 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
1e170 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1e180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1e190 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1e1a0 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1e1b0 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1e1c0 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1e1d0 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1e1e0 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1e1f0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1e200 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1e210 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1e220 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1e230 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1e240 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
1e250 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  edUnused==0.    
1e260 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1e270 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1e280 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1e290 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1e2a0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1e2b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e2c0 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
1e2d0 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1e2e0 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1e2f0 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1e300 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
1e310 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1e320 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1e330 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1e340 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1e350 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
1e360 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
1e370 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
1e380 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1e390 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
1e3a0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
1e3b0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1e3c0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
1e3d0 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
1e3e0 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
1e3f0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1e400 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
1e410 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
1e420 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
1e430 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
1e440 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
1e450 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
1e460 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
1e470 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1e480 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
1e490 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
1e4a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1e4b0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
1e4c0 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
1e4d0 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
1e4e0 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
1e4f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1e500 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
1e510 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
1e520 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
1e530 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
1e540 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
1e550 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1e560 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
1e570 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1e580 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
1e590 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
1e5a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1e5b0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
1e5c0 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41  (SQLITE_MMAP_REA
1e5d0 44 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54  DWRITE) && SQLIT
1e5e0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1e5f0 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
1e600 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
1e610 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
1e620 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
1e630 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
1e640 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
1e650 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
1e660 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
1e670 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
1e680 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1e690 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
1e6a0 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
1e6b0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
1e6c0 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1e6d0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1e6e0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1e6f0 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
1e700 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e720 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
1e730 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
1e740 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
1e750 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1e760 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1e770 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1e780 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
1e790 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
1e7a0 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
1e7b0 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
1e7c0 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
1e7d0 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
1e7e0 23 65 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c 65  #endif. .  while
1e7f0 28 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  ( (wrote = seekA
1e800 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
1e810 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
1e820 29 29 3c 61 6d 74 20 26 26 20 77 72 6f 74 65 3e  ))<amt && wrote>
1e830 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  0 ){.    amt -= 
1e840 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65  wrote;.    offse
1e850 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t += wrote;.    
1e860 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29  pBuf = &((char*)
1e870 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20  pBuf)[wrote];.  
1e880 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  }.  SimulateIOEr
1e890 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29  ror(( wrote=(-1)
1e8a0 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69  , amt=1 ));.  Si
1e8b0 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
1e8c0 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61  ror(( wrote=0, a
1e8d0 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20  mt=1 ));..  if( 
1e8e0 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20  amt>wrote ){.   
1e8f0 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20   if( wrote<0 && 
1e900 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1e910 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20  !=ENOSPC ){.    
1e920 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
1e930 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  et by seekAndWri
1e940 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  te */.      retu
1e950 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1e960 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
1e970 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
1e980 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29  tErrno(pFile, 0)
1e990 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65  ; /* not a syste
1e9a0 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  m error */.     
1e9b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1e9c0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
1e9d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e9e0 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
1e9f0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
1ea00 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
1ea10 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
1ea20 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
1ea30 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1ea40 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
1ea50 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
1ea60 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20  s are occurring 
1ea70 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
1ea80 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1ea90 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
1eaa0 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
1eab0 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
1eac0 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
1ead0 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74   We do not trust
1eae0 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76   systems to prov
1eaf0 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64  ide a working fd
1eb00 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65  atasync().  Some
1eb10 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64   do..** Others d
1eb20 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66  o no.  To be saf
1eb30 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b  e, we will stick
1eb40 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67 68   with the (sligh
1eb50 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66  tly slower).** f
1eb60 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b  sync(). If you k
1eb70 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79  now that your sy
1eb80 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72  stem does suppor
1eb90 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f  t fdatasync() co
1eba0 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e  rrectly,.** then
1ebb0 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20   simply compile 
1ebc0 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63  with -Dfdatasync
1ebd0 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d 44  =fdatasync or -D
1ebe0 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a  HAVE_FDATASYNC.*
1ebf0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
1ec00 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 48 41  datasync) && !HA
1ec10 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64  VE_FDATASYNC.# d
1ec20 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
1ec30 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a  fsync.#endif../*
1ec40 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f  .** Define HAVE_
1ec50 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f  FULLFSYNC to 0 o
1ec60 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
1ec70 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
1ec80 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** the F_FULLFSY
1ec90 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
1eca0 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e  ned.  F_FULLFSYN
1ecb0 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  C is currently.*
1ecc0 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  * only available
1ecd0 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42   on Mac OS X.  B
1ece0 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68  ut that could ch
1ecf0 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ange..*/.#ifdef 
1ed00 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65  F_FULLFSYNC.# de
1ed10 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1ed20 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  YNC 1.#else.# de
1ed30 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1ed40 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69  YNC 0.#endif..#i
1ed50 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 5f  fdef SQLITE_USE_
1ed60 52 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e  REQUEST_FULLFSYN
1ed70 43 0a 23 69 6d 70 6f 72 74 20 3c 6e 6f 74 69 66  C.#import <notif
1ed80 79 2e 68 3e 0a 23 69 6d 70 6f 72 74 20 3c 6c 69  y.h>.#import <li
1ed90 62 6b 65 72 6e 2f 4f 53 41 74 6f 6d 69 63 2e 68  bkern/OSAtomic.h
1eda0 3e 0a 73 74 61 74 69 63 20 4f 53 53 70 69 6e 4c  >.static OSSpinL
1edb0 6f 63 6b 20 6e 6f 74 69 66 79 5f 6c 6f 63 6b 20  ock notify_lock 
1edc0 3d 20 30 3b 0a 23 64 65 66 69 6e 65 20 52 45 51  = 0;.#define REQ
1edd0 55 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f  UEST_FULLSYNC_NO
1ede0 54 49 46 49 43 41 54 49 4f 4e 20 20 20 20 22 63  TIFICATION    "c
1edf0 6f 6d 2e 61 70 70 6c 65 2e 72 65 71 73 79 6e 63  om.apple.reqsync
1ee00 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ".#endif../*.** 
1ee10 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
1ee20 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
1ee30 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
1ee40 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
1ee50 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
1ee60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
1ee70 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
1ee80 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
1ee90 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
1eea0 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
1eeb0 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
1eec0 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
1eed0 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
1eee0 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
1eef0 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
1ef00 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
1ef10 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
1ef20 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
1ef30 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
1ef40 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
1ef50 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
1ef60 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
1ef70 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
1ef80 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
1ef90 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
1efa0 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
1efb0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
1efc0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
1efd0 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
1efe0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
1eff0 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74  ite sets the dat
1f000 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68  aOnly flag if th
1f010 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1f020 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  le is unchanged.
1f030 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68  .** The idea beh
1f040 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20  ind dataOnly is 
1f050 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f  that it should o
1f060 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69  nly write the fi
1f070 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f  le content.** to
1f080 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69   disk, not the i
1f090 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73  node.  We only s
1f0a0 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74  et dataOnly if t
1f0b0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
1f0c0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69  .** unchanged si
1f0d0 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  nce the file siz
1f0e0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1f0f0 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72   inode.  However
1f100 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74  , .** Ted Ts'o t
1f110 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61  ells us that fda
1f120 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c  tasync() will al
1f130 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f  so write the ino
1f140 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c  de if the.** fil
1f150 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67  e size has chang
1f160 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ed.  The only re
1f170 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  al difference be
1f180 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28  tween fdatasync(
1f190 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29  ).** and fsync()
1f1a0 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20  , Ted tells us, 
1f1b0 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  is that fdatasyn
1f1c0 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75  c() will not flu
1f1d0 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20  sh the.** inode 
1f1e0 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20  if the mtime or 
1f1f0 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69  owner or other i
1f200 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20  node attributes 
1f210 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  have changed..**
1f220 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   We only care ab
1f230 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  out the file siz
1f240 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72  e, not the other
1f250 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73   file attributes
1f260 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61  , so.** as far a
1f270 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63  s SQLite is conc
1f280 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73  erned, an fdatas
1f290 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20  ync() is always 
1f2a0 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c  adequate..** So,
1f2b0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66   we always use f
1f2c0 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74  datasync() if it
1f2d0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
1f2e0 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20  egardless of.** 
1f2f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1f300 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a   dataOnly flag..
1f310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75  */.static int fu
1f320 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c  ll_fsync(int fd,
1f330 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69   int fullSync, i
1f340 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
1f350 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
1f360 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64  e following "ifd
1f370 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62  ef/elif/else/" b
1f380 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d  lock has the sam
1f390 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20  e structure as. 
1f3a0 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f   ** the one belo
1f3b0 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61  w. It is replica
1f3c0 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20  ted here solely 
1f3d0 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72  to avoid clutter
1f3e0 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ing .  ** up the
1f3f0 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20   real code with 
1f400 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  the UNUSED_PARAM
1f410 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20  ETER() macros.. 
1f420 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1f430 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53  E_NO_SYNC.  UNUS
1f440 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
1f450 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1f460 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
1f470 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f480 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1f490 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1f4a0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
1f4b0 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1f4c0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
1f4d0 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
1f4e0 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
1f4f0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1f500 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
1f510 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
1f520 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
1f530 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
1f540 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
1f550 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
1f560 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
1f570 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
1f580 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
1f590 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
1f5a0 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
1f5b0 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
1f5c0 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1f5d0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
1f5e0 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
1f5f0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1f600 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
1f610 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
1f620 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
1f630 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
1f640 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1f650 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
1f660 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
1f670 6f 2d 6f 70 2e 20 20 42 75 74 20 67 6f 20 61 68  o-op.  But go ah
1f680 65 61 64 20 61 6e 64 20 63 61 6c 6c 20 66 73 74  ead and call fst
1f690 61 74 28 29 20 74 6f 20 76 61 6c 69 64 61 74 65  at() to validate
1f6a0 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64   the file.  ** d
1f6b0 65 73 63 72 69 70 74 6f 72 20 61 73 20 77 65 20  escriptor as we 
1f6c0 6e 65 65 64 20 61 20 6d 65 74 68 6f 64 20 74 6f  need a method to
1f6d0 20 70 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75   provoke a failu
1f6e0 72 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63  re during.  ** c
1f6f0 6f 76 65 72 61 74 65 20 74 65 73 74 69 6e 67 2e  overate testing.
1f700 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1f710 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a  ITE_NO_SYNC.  {.
1f720 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1f730 62 75 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  buf;.    rc = os
1f740 46 73 74 61 74 28 66 64 2c 20 26 62 75 66 29 3b  Fstat(fd, &buf);
1f750 0a 20 20 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f  .  }.#elif HAVE_
1f760 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20  FULLFSYNC.  if( 
1f770 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 23 69 66 64  fullSync ){.#ifd
1f780 65 66 20 53 51 4c 49 54 45 5f 55 53 45 5f 52 45  ef SQLITE_USE_RE
1f790 51 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a  QUEST_FULLFSYNC.
1f7a0 20 20 20 20 72 63 20 3d 20 6f 73 46 73 79 6e 63      rc = osFsync
1f7b0 28 66 64 29 3b 0a 20 20 20 20 69 66 20 28 21 72  (fd);.    if (!r
1f7c0 63 29 20 7b 0a 20 20 20 20 20 20 4f 53 53 70 69  c) {.      OSSpi
1f7d0 6e 4c 6f 63 6b 4c 6f 63 6b 28 26 6e 6f 74 69 66  nLockLock(&notif
1f7e0 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  y_lock);.      r
1f7f0 63 20 3d 20 6e 6f 74 69 66 79 5f 70 6f 73 74 28  c = notify_post(
1f800 52 45 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e 43  REQUEST_FULLSYNC
1f810 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e 29 3b 0a  _NOTIFICATION);.
1f820 20 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b        OSSpinLock
1f830 55 6e 6c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c  Unlock(&notify_l
1f840 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  ock);.    }.#els
1f850 65 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  e.    rc = osFcn
1f860 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
1f870 4e 43 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  NC, 0);.#endif. 
1f880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1f890 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20   1;.  }.  /* If 
1f8a0 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61  the FULLFSYNC fa
1f8b0 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20  iled, fall back 
1f8c0 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  to attempting an
1f8d0 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49   fsync()..  ** I
1f8e0 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70  t shouldn't be p
1f8f0 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c  ossible for full
1f900 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e  fsync to fail on
1f910 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a   the local .  **
1f920 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e   file system (on
1f930 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72   OSX), so failur
1f940 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1f950 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20   FULLFSYNC.  ** 
1f960 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
1f970 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79  for this file sy
1f980 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70  stem. So, attemp
1f990 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a  t an fsync .  **
1f9a0 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69   and (for now) i
1f9b0 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65  gnore the overhe
1f9c0 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75  ad of a superflu
1f9d0 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20  ous fcntl call. 
1f9e0 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62   .  ** It'd be b
1f9f0 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20  etter to detect 
1fa00 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72  fullfsync suppor
1fa10 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64  t once and avoid
1fa20 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c   .  ** the fcntl
1fa30 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65   call every time
1fa40 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e   sync is called.
1fa50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29  .  */.  if( rc )
1fa60 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1fa70 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ..#elif defined(
1fa80 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20  __APPLE__).  /* 
1fa90 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48  fdatasync() on H
1faa0 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20  FS+ doesn't yet 
1fab0 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20 73  flush the file s
1fac0 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67 65  ize if it change
1fad0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1fae0 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65   so currently we
1faf0 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20   default to the 
1fb00 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65 66  macro that redef
1fb10 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20 74  ines fdatasync t
1fb20 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72  o fsync.  */.  r
1fb30 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23  c = fsync(fd);.#
1fb40 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61  else .  rc = fda
1fb50 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20  tasync(fd);.#if 
1fb60 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
1fb70 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f   rc==-1 && errno
1fb80 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20  ==ENOTSUP ){.   
1fb90 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1fba0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
1fbb0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e  S_VXWORKS */.#en
1fbc0 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
1fbd0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66  ITE_NO_SYNC elif
1fbe0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1fbf0 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57  */..  if( OS_VXW
1fc00 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20  ORKS && rc!= -1 
1fc10 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
1fc20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1fc30 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1fc40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1fc50 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
1fc60 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
1fc70 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
1fc80 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
1fc90 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
1fca0 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
1fcb0 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
1fcc0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1fcd0 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
1fce0 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
1fcf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
1fd00 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
1fd10 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
1fd20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
1fd30 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
1fd40 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
1fd50 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  The directory fi
1fd60 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1fd70 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f   used for only o
1fd80 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a  ne thing - to.**
1fd90 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65 63   fsync() a direc
1fda0 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  tory to make sur
1fdb0 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
1fdc0 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65  and deletion eve
1fdd0 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68  nts.** are flush
1fde0 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63  ed to disk.  Suc
1fdf0 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74  h fsyncs are not
1fe00 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72   needed on newer
1fe10 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66  .** journaling f
1fe20 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20  ilesystems, but 
1fe30 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
1fe40 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d  older filesystem
1fe50 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1fe60 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65  utine can be ove
1fe70 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68  rridden using th
1fe80 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e  e xSetSysCall in
1fe90 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20  terface..** The 
1fea0 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72  ability to overr
1feb0 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ide this routine
1fec0 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73 75   was added in su
1fed0 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  pport of the.** 
1fee0 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78  chromium sandbox
1fef0 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72  .  Opening a dir
1ff00 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63 75  ectory is a secu
1ff10 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61 72  rity risk (we ar
1ff20 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61  e.** told) so ma
1ff30 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65  king it override
1ff40 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  able allows the 
1ff50 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78  chromium sandbox
1ff60 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74   to.** replace t
1ff70 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
1ff80 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
1ff90 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73  p.  To make this
1ffa0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f   routine.** a no
1ffb0 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20  -op, replace it 
1ffc0 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61 74  with a stub that
1ffd0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1ffe0 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a  OK but leaves.**
1fff0 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e   *pFd set to a n
20000 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a  egative number..
20010 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
20020 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
20030 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
20040 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c  sponsible for cl
20050 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c  osing.** the fil
20060 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46  e descriptor *pF
20070 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e  d using close().
20080 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
20090 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
200a0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
200b0 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20  me, int *pFd){. 
200c0 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66   int ii;.  int f
200d0 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a  d = -1;.  char z
200e0 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Dirname[MAX_PATH
200f0 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69  NAME+1];..  sqli
20100 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
20110 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e  _PATHNAME, zDirn
20120 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ame, "%s", zFile
20130 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  name);.  for(ii=
20140 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72  (int)strlen(zDir
20150 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26 20 7a  name); ii>0 && z
20160 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27  Dirname[ii]!='/'
20170 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69  ; ii--);.  if( i
20180 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e  i>0 ){.    zDirn
20190 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a  ame[ii] = '\0';.
201a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
201b0 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d 27 2f   zDirname[0]!='/
201c0 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 20  ' ) zDirname[0] 
201d0 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69 72 6e  = '.';.    zDirn
201e0 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a  ame[1] = 0;.  }.
201f0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
20200 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
20210 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
20220 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20  0);.  if( fd>=0 
20230 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
20240 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
20250 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
20260 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46 64 20  e));.  }.  *pFd 
20270 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64 3e 3d  = fd;.  if( fd>=
20280 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
20290 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 75  E_OK;.  return u
202a0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
202b0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
202c0 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  , "openDirectory
202d0 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d 0a  ", zDirname);.}.
202e0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
202f0 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
20300 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
20310 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
20320 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
20330 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
20340 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
20350 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
20360 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
20370 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
20380 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
20390 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
203a0 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
203b0 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
203c0 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
203d0 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
203e0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
203f0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
20400 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
20410 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
20420 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
20430 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
20440 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
20450 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
20460 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
20470 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
20480 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
20490 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
204a0 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
204b0 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
204c0 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
204d0 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
204e0 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
204f0 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
20500 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
20510 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
20520 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
20530 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
20540 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
20550 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
20560 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
20570 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
20580 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
20590 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
205a0 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
205b0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
205c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
205d0 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
205e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
205f0 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
20600 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
20610 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
20620 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
20630 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
20640 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
20650 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
20660 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
20670 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
20680 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
20690 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
206a0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
206b0 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
206c0 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
206d0 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
206e0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
206f0 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
20700 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
20710 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
20720 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
20730 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
20740 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
20750 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
20760 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
20770 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
20780 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
20790 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
207a0 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
207b0 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
207c0 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
207d0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
207e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
207f0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
20800 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
20810 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
20820 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
20830 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
20840 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
20850 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
20860 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
20870 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
20880 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
20890 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
208a0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
208b0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
208c0 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63  YNC, "full_fsync
208d0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
208e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ;.  }..  /* Also
208f0 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63   fsync the direc
20900 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
20910 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20  the file if the 
20920 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a  DIRSYNC flag.  *
20930 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20  * is set.  This 
20940 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63  is a one-time oc
20950 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20  currence.  Many 
20960 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65  systems (example
20970 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65  s: AIX).  ** are
20980 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63   unable to fsync
20990 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f   a directory, so
209a0 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f   ignore errors o
209b0 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a  n the fsync..  *
209c0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
209d0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
209e0 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20  ILE_DIRSYNC ){. 
209f0 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20     int dirfd;.  
20a00 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
20a10 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c  YNC %s (have_ful
20a20 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
20a30 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
20a40 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ->zPath,.       
20a50 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
20a60 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
20a70 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  );.    rc = osOp
20a80 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c  enDirectory(pFil
20a90 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64  e->zPath, &dirfd
20aa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
20ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20ac0 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
20ad0 66 64 2c 20 30 2c 20 30 29 3b 0a 23 69 66 20 4f  fd, 0, 0);.#if O
20ae0 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
20af0 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 69  SE_IOERR.      i
20b00 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e  f( close(pFile->
20b10 64 69 72 66 64 29 20 29 7b 0a 20 20 20 20 20 20  dirfd) ){.      
20b20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
20b30 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
20b40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20b50 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
20b60 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  OSE;.      }.#el
20b70 73 65 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  se.      robust_
20b80 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72  close(pFile, dir
20b90 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23  fd, __LINE__);.#
20ba0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
20bb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
20bc0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
20bd0 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  EN );.      rc =
20be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20bf0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  }.    pFile->ctr
20c00 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46  lFlags &= ~UNIXF
20c10 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 0a 20 20  ILE_DIRSYNC;..  
20c20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20c30 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
20c40 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
20c50 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
20c60 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
20c70 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c  unixTruncate(sql
20c80 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
20c90 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69  64 nByte){.  uni
20ca0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
20cb0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
20cc0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
20cd0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
20ce0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
20cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
20d00 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a  RR_TRUNCATE );..
20d10 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
20d20 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
20d30 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
20d40 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
20d50 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
20d60 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
20d70 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
20d80 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
20d90 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
20da0 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
20db0 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
20dc0 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
20dd0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
20de0 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
20df0 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
20e00 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
20e10 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
20e20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
20e30 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
20e40 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
20e50 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
20e60 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f  ;.  }..  rc = ro
20e70 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
20e80 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b  File->h, nByte);
20e90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
20ea0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
20eb0 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
20ec0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
20ed0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20ee0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
20ef0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
20f00 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
20f10 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
20f20 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66  _DEBUG.    /* If
20f30 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
20f40 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
20f50 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
20f60 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
20f70 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f     ** doing a ho
20f80 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
20f90 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
20fa0 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
20fb0 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e   than a.    ** n
20fc0 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
20fd0 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e  ile) and we trun
20fe0 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
20ff0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20   zero length,.  
21000 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74    ** that effect
21010 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68  ively updates th
21020 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
21030 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  .  This might ha
21040 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ppen.    ** when
21050 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74   restoring a dat
21060 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
21070 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20  backup API from 
21080 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20  a zero-length.  
21090 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20    ** source..   
210a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
210b0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
210c0 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
210d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
210e0 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a  nsCntrChng = 1;.
210f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69      }.#endif..#i
21100 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
21110 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20  P_SIZE>0.    /* 
21120 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
21130 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20 74  just truncated t
21140 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72  o a size smaller
21150 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
21160 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65  tly.    ** mappe
21170 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65  d region, reduce
21180 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d   the effective m
21190 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77  apping size as w
211a0 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c  ell. SQLite will
211b0 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61 64  .    ** use read
211c0 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74  () and write() t
211d0 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65  o access data be
211e0 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20  yond this point 
211f0 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20  from now on.  . 
21200 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42     */.    if( nB
21210 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte<pFile->mmapS
21220 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ize ){.      pFi
21230 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e  le->mmapSize = n
21240 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Byte;.    }.#end
21250 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
21260 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
21270 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
21280 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
21290 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
212a0 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
212b0 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
212c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
212d0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
212e0 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
212f0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
21300 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
21310 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69   = osFstat(((uni
21320 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
21330 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
21340 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
21350 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
21360 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
21370 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
21380 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
21390 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
213a0 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a  R_FSTAT;.  }.  *
213b0 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73  pSize = buf.st_s
213c0 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  ize;..  /* When 
213d0 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73  opening a zero-s
213e0 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ize database, th
213f0 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  e findInodeInfo(
21400 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  ) procedure.  **
21410 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65   writes a single
21420 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20   byte into that 
21430 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
21440 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62   work around a b
21450 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f  ug.  ** in the O
21460 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79  S-X msdos filesy
21470 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20  stem.  In order 
21480 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
21490 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a  s with upper.  *
214a0 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65  * layers, we nee
214b0 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73  d to report this
214c0 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65   file size as ze
214d0 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  ro even though i
214e0 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79  t is.  ** really
214f0 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32   1.   Ticket #32
21500 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a  60..  */.  if( *
21510 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a  pSize==1 ) *pSiz
21520 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72  e = 0;...  retur
21530 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21540 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
21550 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
21560 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
21570 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  LE__)./*.** Hand
21580 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f  ler for proxy-lo
21590 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72  cking file-contr
215a0 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e  ol verbs.  Defin
215b0 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a  ed below in the.
215c0 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  ** proxying lock
215d0 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  ing division..*/
215e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
215f0 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
21600 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
21610 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  oid*);.#endif../
21620 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
21630 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
21640 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49   handle the SQLI
21650 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
21660 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74  NT .** file-cont
21670 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  rol operation.  
21680 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74 61  Enlarge the data
21690 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69  base to nBytes i
216a0 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64  n size.** (round
216b0 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78  ed up to the nex
216c0 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20  t chunk-size).  
216d0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
216e0 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42  is already.** nB
216f0 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20  ytes or larger, 
21700 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
21710 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
21720 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65  ic int fcntlSize
21730 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  Hint(unixFile *p
21740 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29  File, i64 nByte)
21750 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  {.  if( pFile->s
21760 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
21770 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  i64 nSize;      
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21790 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   Required file s
217a0 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
217b0 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20 20  t stat buf;     
217c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
217d0 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20   to hold return 
217e0 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28  values of fstat(
217f0 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28  ) */.   .    if(
21800 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
21810 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
21820 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
21830 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
21840 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21850 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
21860 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a  .    }..    nSiz
21870 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c  e = ((nByte+pFil
21880 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20  e->szChunk-1) / 
21890 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
218a0 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
218b0 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e  ;.    if( nSize>
218c0 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65  (i64)buf.st_size
218d0 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   ){..#if defined
218e0 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
218f0 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
21900 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
21910 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
21920 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69   below is handli
21930 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ng the return va
21940 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61  lue of osFalloca
21950 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63  te() .      ** c
21960 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f  orrectly. posix_
21970 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64  fallocate() is d
21980 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72  efined to "retur
21990 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  ns zero on succe
219a0 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72  ss, .      ** or
219b0 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72   an error number
219c0 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53   on  failure". S
219d0 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66  ee the manpage f
219e0 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
219f0 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20       int err;.  
21a00 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
21a10 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74  err = osFallocat
21a20 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e  e(pFile->h, buf.
21a30 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62  st_size, nSize-b
21a40 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20  uf.st_size);.   
21a50 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d     }while( err==
21a60 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69  EINTR );.      i
21a70 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e 20  f( err ) return 
21a80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
21a90 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  TE;.#else.      
21aa0 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65  /* If the OS doe
21ab0 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78  s not have posix
21ac0 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61  _fallocate(), fa
21ad0 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61 20 0a  ke it. Write a .
21ae0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
21af0 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74  byte to the last
21b00 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c   byte in each bl
21b10 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73 20 65  ock that falls e
21b20 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a  ntirely.      **
21b30 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
21b40 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 65  nded region. The
21b50 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64 2c 20  n, if required, 
21b60 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
21b70 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
21b80 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73   (nSize-1), to s
21b90 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
21ba0 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63 74 6c  he file correctl
21bb0 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  y..      ** This
21bc0 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20 74 65   is a similar te
21bd0 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61 74 20  chnique to that 
21be0 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 6f 6e  used by glibc on
21bf0 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20 20 2a   systems.      *
21c00 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  * that do not ha
21c10 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
21c20 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20  ate() call..    
21c30 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
21c40 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
21c50 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
21c60 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
21c70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 57   */.      int nW
21c80 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rite = 0;       
21c90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21ca0 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
21cb0 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
21cc0 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
21cd0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
21ce0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
21cf0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
21d00 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72 69 74   */..      iWrit
21d10 65 20 3d 20 28 62 75 66 2e 73 74 5f 73 69 7a 65  e = (buf.st_size
21d20 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42  /nBlk)*nBlk + nB
21d30 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  lk - 1;.      as
21d40 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75  sert( iWrite>=bu
21d50 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20  f.st_size );.   
21d60 20 20 20 61 73 73 65 72 74 28 20 28 28 69 57 72     assert( ((iWr
21d70 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20  ite+1)%nBlk)==0 
21d80 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e  );.      for(/*n
21d90 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e  o-op*/; iWrite<n
21da0 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72  Size+nBlk-1; iWr
21db0 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20  ite+=nBlk ){.   
21dc0 20 20 20 20 20 69 66 28 20 69 57 72 69 74 65 3e       if( iWrite>
21dd0 3d 6e 53 69 7a 65 20 29 20 69 57 72 69 74 65 20  =nSize ) iWrite 
21de0 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20  = nSize - 1;.   
21df0 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65       nWrite = se
21e00 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
21e10 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29  , iWrite, "", 1)
21e20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57  ;.        if( nW
21e30 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e  rite!=1 ) return
21e40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
21e50 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ITE;.      }.#en
21e60 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  dif.    }.  }..#
21e70 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
21e80 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
21e90 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
21ea0 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46  ax>0 && nByte>pF
21eb0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
21ec0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
21ed0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
21ee0 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk<=0 ){.      
21ef0 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
21f00 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
21f10 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
21f20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
21f30 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
21f40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e         return un
21f50 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
21f60 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
21f70 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
21f80 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
21f90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21fa0 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
21fb0 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  e(pFile, nByte);
21fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21fd0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
21fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21ff0 7d 0a 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f  }...#if (SQLITE_
22000 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
22010 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  >0) && defined(_
22020 5f 41 50 50 4c 45 5f 5f 29 0a 23 69 6e 63 6c 75  _APPLE__).#inclu
22030 64 65 20 22 73 71 6c 69 74 65 33 5f 70 72 69 76  de "sqlite3_priv
22040 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  ate.h".#include 
22050 3c 63 6f 70 79 66 69 6c 65 2e 68 3e 0a 73 74 61  <copyfile.h>.sta
22060 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
22070 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
22080 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
22090 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29  e, char *dbPath)
220a0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ;.#endif..#if SQ
220b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
220c0 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
220d0 20 69 6e 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b   int isProxyLock
220e0 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65  ingMode(unixFile
220f0 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66   *);.#endif..#if
22100 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
22110 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
22120 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
22130 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
22140 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62 61  ixTruncateDataba
22150 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20 69  se(unixFile *, i
22160 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  nt);..static int
22170 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65 53   unixInvalidateS
22180 75 70 70 6f 72 74 46 69 6c 65 73 28 75 6e 69 78  upportFiles(unix
22190 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73  File *, int);..s
221a0 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72  tatic int findCr
221b0 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 63 6f 6e  eateFileMode(con
221c0 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20  st char *, int, 
221d0 6d 6f 64 65 5f 74 2a 2c 20 75 69 64 5f 74 20 2a  mode_t*, uid_t *
221e0 2c 67 69 64 5f 74 20 2a 29 3b 0a 0a 2f 2a 20 6f  ,gid_t *);../* o
221f0 70 65 6e 73 20 61 20 72 65 61 64 2f 77 72 69 74  pens a read/writ
22200 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
22210 61 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 68  a file zName inh
22220 65 72 69 74 69 6e 67 20 74 68 65 20 61 70 70 72  eriting the appr
22230 6f 70 72 69 61 74 65 0a 2a 2a 20 75 73 65 72 2f  opriate.** user/
22240 70 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 64  perms from the d
22250 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
22260 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e  running as root.
22270 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 66 69    Returns the fi
22280 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  le .** descripto
22290 72 20 62 79 20 72 65 66 65 72 65 6e 63 65 0a 2a  r by reference.*
222a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
222b0 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c 65 28 0a  xOpenChildFile(.
222c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
222d0 61 6d 65 2c 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ame,.  int openF
222e0 6c 61 67 73 2c 0a 20 20 69 6e 74 20 64 62 4f 70  lags,.  int dbOp
222f0 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 70  enFlags,.  int p
22300 72 6f 74 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20  rotFlags,.  int 
22310 2a 70 46 64 0a 29 7b 0a 20 20 69 6e 74 20 66 64  *pFd.){.  int fd
22320 20 3d 20 2d 31 3b 0a 20 20 6d 6f 64 65 5f 74 20   = -1;.  mode_t 
22330 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
22340 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
22350 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
22360 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75  file with */.  u
22370 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20  id_t uid;       
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22390 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66  Userid for the f
223a0 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 67  ile */.  gid_t g
223b0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
223c0 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69         /* Groupi
223d0 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
223e0 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20  /.  int rc;.  . 
223f0 20 61 73 73 65 72 74 28 70 46 64 21 3d 4e 55 4c   assert(pFd!=NUL
22400 4c 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 43  L);.  rc = findC
22410 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e  reateFileMode(zN
22420 61 6d 65 2c 20 64 62 4f 70 65 6e 46 6c 61 67 73  ame, dbOpenFlags
22430 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69  , &openMode, &ui
22440 64 2c 20 26 67 69 64 29 3b 0a 20 20 69 66 28 20  d, &gid);.  if( 
22450 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22460 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22470 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73    }.  fd = robus
22480 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
22490 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
224a0 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  e);.  OSTRACE(("
224b0 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
224c0 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
224d0 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
224e0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
224f0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
22500 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
22510 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
22520 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
22530 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2f  turn rc;.  }.  /
22540 2a 20 69 66 20 77 65 27 72 65 20 6f 70 65 6e 69  * if we're openi
22550 6e 67 20 74 68 65 20 77 61 6c 20 6f 72 20 6a 6f  ng the wal or jo
22560 75 72 6e 61 6c 20 61 6e 64 20 72 75 6e 6e 69 6e  urnal and runnin
22570 67 20 61 73 20 72 6f 6f 74 2c 20 73 65 74 0a 20  g as root, set. 
22580 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
22590 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20 69 66 28  uid/gid */.  if(
225a0 20 64 62 4f 70 65 6e 46 6c 61 67 73 20 26 20 28   dbOpenFlags & (
225b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
225c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
225d0 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
225e0 20 75 69 64 5f 74 20 65 75 69 64 20 3d 20 67 65   uid_t euid = ge
225f0 74 65 75 69 64 28 29 3b 0a 20 20 20 20 69 66 28  teuid();.    if(
22600 20 65 75 69 64 3d 3d 30 20 26 26 20 28 65 75 69   euid==0 && (eui
22610 64 21 3d 75 69 64 20 7c 7c 20 67 65 74 65 67 69  d!=uid || getegi
22620 64 28 29 21 3d 67 69 64 29 20 29 7b 0a 20 20 20  d()!=gid) ){.   
22630 20 20 20 69 66 28 20 66 63 68 6f 77 6e 28 66 64     if( fchown(fd
22640 2c 20 75 69 64 2c 20 67 69 64 29 20 29 7b 0a 20  , uid, gid) ){. 
22650 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22660 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
22670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22680 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
22690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
226a0 70 46 64 20 3d 20 66 64 3b 0a 20 20 7d 20 65 6c  pFd = fd;.  } el
226b0 73 65 20 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20  se {.    *pFd = 
226c0 2d 31 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64  -1;.    close(fd
226d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
226e0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
226f0 74 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61 74  t unixReplaceDat
22700 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  abase(unixFile *
22710 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 20 2a  pFile, sqlite3 *
22720 73 72 63 64 62 29 20 7b 0a 20 20 73 71 6c 69 74  srcdb) {.  sqlit
22730 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73  e3_file *id = (s
22740 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46  qlite3_file *)pF
22750 69 6c 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 53  ile;.  Btree *pS
22760 72 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a  rcBtree = NULL;.
22770 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22780 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b  src_file = NULL;
22790 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 53 72  .  unixFile *pSr
227a0 63 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  cFile = NULL;.  
227b0 63 68 61 72 20 73 72 63 57 61 6c 50 61 74 68 5b  char srcWalPath[
227c0 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20  MAXPATHLEN+5];. 
227d0 20 69 6e 74 20 73 72 63 57 61 6c 46 44 20 3d 20   int srcWalFD = 
227e0 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  -1;.  int rc = S
227f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64  QLITE_OK;.  void
22800 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a   *pLock = NULL;.
22810 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b    int flags = 0;
22820 0a 20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64  .  sqlite3 *srcd
22830 62 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 70  b2 = NULL;.  cop
22840 79 66 69 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b  yfile_state_t s;
22850 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 53 72  .  int corruptSr
22860 63 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  cFileLock = 0;. 
22870 20 69 6e 74 20 63 6f 72 72 75 70 74 44 73 74 46   int corruptDstF
22880 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69  ileLock = 0;.  i
22890 6e 74 20 69 73 53 72 63 43 6f 72 72 75 70 74 20  nt isSrcCorrupt 
228a0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 44 73 74  = 0;.  int isDst
228b0 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 0a  Corrupt = 0;.  .
228c0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
228d0 66 65 74 79 43 68 65 63 6b 4f 6b 28 73 72 63 64  fetyCheckOk(srcd
228e0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
228f0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
22900 20 20 7d 0a 20 20 20 20 0a 23 69 66 20 53 51 4c    }.    .#if SQL
22910 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
22920 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61  PROTECTION.  fla
22930 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f  gs |= pFile->pro
22940 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23  tFlags;.#endif.#
22950 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
22960 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
22970 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b   if( isProxyLock
22980 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29  ingMode(pFile) )
22990 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
229a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
229b0 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ROXY;.  }.#endif
229c0 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
229d0 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
229e0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30  (pFile->zPath, 0
229f0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26  , flags, 0, 0, &
22a00 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63  pLock);.  if( rc
22a10 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
22a20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
22a30 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  | rc==SQLITE_NOT
22a40 41 44 42 20 29 7b 0a 20 20 20 20 20 20 69 73 44  ADB ){.      isD
22a50 73 74 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20  stCorrupt = 1;. 
22a60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22a70 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f  3demo_superlock_
22a80 63 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49  corrupt(id, SQLI
22a90 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
22aa0 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f 72              &cor
22ad0 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29  ruptDstFileLock)
22ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22af0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
22b00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
22b10 0a 20 20 2f 2a 20 67 65 74 20 74 68 65 20 73 72  .  /* get the sr
22b20 63 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  c file descripto
22b30 72 20 61 64 68 65 72 69 6e 67 20 74 6f 20 74 68  r adhering to th
22b40 65 20 64 62 20 73 74 72 75 63 74 20 61 63 63 65  e db struct acce
22b50 73 73 20 72 75 6c 65 73 20 0a 20 20 20 2a 2a 20  ss rules .   ** 
22b60 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64  this code is mod
22b70 65 6c 65 64 20 61 66 74 65 72 20 73 71 6c 69 74  eled after sqlit
22b80 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
22b90 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20 20 20 2a  ) in main.c.   *
22ba0 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  / .  sqlite3_mut
22bb0 65 78 5f 65 6e 74 65 72 28 73 72 63 64 62 2d 3e  ex_enter(srcdb->
22bc0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 72  mutex);.  if( sr
22bd0 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20 20  cdb->nDb>0 ){.  
22be0 20 20 70 53 72 63 42 74 72 65 65 20 3d 20 73 72    pSrcBtree = sr
22bf0 63 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3b  cdb->aDb[0].pBt;
22c00 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 42  .  }.  if( pSrcB
22c10 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
22c20 72 20 2a 70 53 72 63 50 61 67 65 72 3b 0a 20 20  r *pSrcPager;.  
22c30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
22c40 74 65 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a  ter(pSrcBtree);.
22c50 20 20 20 20 70 53 72 63 50 61 67 65 72 20 3d 20      pSrcPager = 
22c60 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
22c70 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20  r(pSrcBtree);.  
22c80 20 20 61 73 73 65 72 74 28 20 70 53 72 63 50 61    assert( pSrcPa
22c90 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 73 72  ger!=0 );.    sr
22ca0 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  c_file = sqlite3
22cb0 50 61 67 65 72 46 69 6c 65 28 70 53 72 63 50 61  PagerFile(pSrcPa
22cc0 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
22cd0 28 20 73 72 63 5f 66 69 6c 65 21 3d 30 20 29 3b  ( src_file!=0 );
22ce0 0a 20 20 20 20 69 66 28 20 73 72 63 5f 66 69 6c  .    if( src_fil
22cf0 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  e->pMethods ){. 
22d00 20 20 20 20 20 69 6e 74 20 73 72 63 46 6c 61 67       int srcFlag
22d10 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 72  s = 0;.      pSr
22d20 63 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  cFile = (unixFil
22d30 65 20 2a 29 73 72 63 5f 66 69 6c 65 3b 0a 23 69  e *)src_file;.#i
22d40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22d50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c  LOCKING_STYLE ||
22d60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
22d70 5f 5f 29 0a 20 20 20 20 20 20 69 66 20 28 28 70  __).      if ((p
22d80 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  SrcFile->openFla
22d90 67 73 20 26 20 4f 5f 52 44 57 52 29 20 3d 3d 20  gs & O_RDWR) == 
22da0 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20 20 20 20  O_RDWR) {.      
22db0 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c    srcFlags = SQL
22dc0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22dd0 54 45 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  TE;.      } else
22de0 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46 6c   {.        srcFl
22df0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
22e00 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
22e10 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
22e20 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  srcFlags = SQLIT
22e30 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
22e40 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
22e50 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
22e60 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
22e70 20 73 72 63 46 6c 61 67 73 20 7c 3d 20 70 53 72   srcFlags |= pSr
22e80 63 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  cFile->protFlags
22e90 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
22ea0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
22eb0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
22ec0 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  f( isProxyLockin
22ed0 67 4d 6f 64 65 28 70 53 72 63 46 69 6c 65 29 20  gMode(pSrcFile) 
22ee0 29 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46 6c  ){.        srcFl
22ef0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
22f00 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20  EN_AUTOPROXY;.  
22f10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22f20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
22f30 6f 70 65 6e 5f 76 32 28 70 53 72 63 46 69 6c 65  open_v2(pSrcFile
22f40 2d 3e 7a 50 61 74 68 2c 20 26 73 72 63 64 62 32  ->zPath, &srcdb2
22f50 2c 20 73 72 63 46 6c 61 67 73 2c 20 30 29 3b 0a  , srcFlags, 0);.
22f60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22f80 20 20 20 2f 2a 20 73 74 61 72 74 20 61 20 64 65     /* start a de
22f90 66 65 72 72 65 64 20 74 72 61 6e 73 61 63 74 69  ferred transacti
22fa0 6f 6e 20 61 6e 64 20 72 65 61 64 20 74 6f 20 65  on and read to e
22fb0 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64 20  stablish a read 
22fc0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
22fd0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
22fe0 63 28 73 72 63 64 62 32 2c 20 22 42 45 47 49 4e  c(srcdb2, "BEGIN
22ff0 20 44 45 46 45 52 52 45 44 3b 20 50 52 41 47 4d   DEFERRED; PRAGM
23000 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  A schema_version
23010 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
23030 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
23040 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
23050 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c  RRUPT || rc==SQL
23060 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20  ITE_NOTADB ){.  
23070 20 20 20 20 20 20 20 20 69 73 53 72 63 43 6f 72          isSrcCor
23080 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rupt = 1;.      
23090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
230a0 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63  demo_superlock_c
230b0 6f 72 72 75 70 74 28 73 72 63 5f 66 69 6c 65 2c  orrupt(src_file,
230c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41   SQLITE_LOCK_SHA
230d0 52 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RED,.           
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23100 20 20 26 63 6f 72 72 75 70 74 53 72 63 46 69 6c    &corruptSrcFil
23110 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20  eLock);.        
23120 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
23130 20 20 7d 0a 20 20 69 66 28 20 21 73 72 63 64 62    }.  if( !srcdb
23140 32 20 7c 7c 20 70 53 72 63 46 69 6c 65 3d 3d 4e  2 || pSrcFile==N
23150 55 4c 4c 20 7c 7c 20 70 53 72 63 46 69 6c 65 2d  ULL || pSrcFile-
23160 3e 68 3c 30 29 7b 0a 20 20 20 20 72 63 20 3d 20  >h<0){.    rc = 
23170 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b  SQLITE_INTERNAL;
23180 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
23190 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
231a0 67 6f 74 6f 20 65 6e 64 5f 72 65 70 6c 61 63 65  goto end_replace
231b0 5f 64 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  _database;.  }. 
231c0 20 2f 2a 20 62 6f 74 68 20 64 61 74 61 62 61 73   /* both databas
231d0 65 73 20 61 72 65 20 6c 6f 63 6b 65 64 20 61 70  es are locked ap
231e0 70 72 6f 70 72 69 61 74 65 6c 79 2c 20 63 6f 70  propriately, cop
231f0 79 20 74 68 65 20 73 72 63 20 77 61 6c 20 6a 6f  y the src wal jo
23200 75 72 6e 61 6c 20 69 66 20 0a 20 20 20 2a 2a 20  urnal if .   ** 
23210 6f 6e 65 20 65 78 69 73 74 73 20 61 6e 64 20 74  one exists and t
23220 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 64  hen the actual d
23230 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
23240 2a 2f 0a 20 20 73 74 72 6c 63 70 79 28 73 72 63  */.  strlcpy(src
23250 57 61 6c 50 61 74 68 2c 20 70 53 72 63 46 69 6c  WalPath, pSrcFil
23260 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
23270 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 74 72 6c 63  HLEN+5);.  strlc
23280 61 74 28 73 72 63 57 61 6c 50 61 74 68 2c 20 22  at(srcWalPath, "
23290 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45  -wal", MAXPATHLE
232a0 4e 2b 35 29 3b 0a 20 20 73 72 63 57 61 6c 46 44  N+5);.  srcWalFD
232b0 20 3d 20 6f 70 65 6e 28 73 72 63 57 61 6c 50 61   = open(srcWalPa
232c0 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  th, O_RDONLY);. 
232d0 20 69 66 28 20 21 28 73 72 63 57 61 6c 46 44 3c   if( !(srcWalFD<
232e0 30 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 64  0) ){.    char d
232f0 73 74 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  stWalPath[MAXPAT
23300 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20 69 6e 74  HLEN+5];.    int
23310 20 64 73 74 57 61 6c 46 44 20 3d 20 2d 31 3b 0a   dstWalFD = -1;.
23320 20 20 20 20 69 6e 74 20 70 72 6f 74 46 6c 61 67      int protFlag
23330 73 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 6c 63  s = 0;.    strlc
23340 70 79 28 64 73 74 57 61 6c 50 61 74 68 2c 20 70  py(dstWalPath, p
23350 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
23360 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20  PATHLEN+5);.    
23370 73 74 72 6c 63 61 74 28 64 73 74 57 61 6c 50 61  strlcat(dstWalPa
23380 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50  th, "-wal", MAXP
23390 41 54 48 4c 45 4e 2b 35 29 3b 0a 0a 20 20 20 20  ATHLEN+5);..    
233a0 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 43 68 69  rc = unixOpenChi
233b0 6c 64 46 69 6c 65 28 64 73 74 57 61 6c 50 61 74  ldFile(dstWalPat
233c0 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  h, O_RDWR|O_CREA
233d0 54 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  T, SQLITE_OPEN_W
233e0 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL,.            
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23400 72 6f 74 46 6c 61 67 73 2c 20 26 64 73 74 57 61  rotFlags, &dstWa
23410 6c 46 44 29 3b 0a 20 20 20 20 69 66 28 20 72 63  lFD);.    if( rc
23420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23430 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c       s = copyfil
23440 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b  e_state_alloc();
23450 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 73 72 63  .      lseek(src
23460 57 61 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53  WalFD, 0, SEEK_S
23470 45 54 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b  ET);.      lseek
23480 28 64 73 74 57 61 6c 46 44 2c 20 30 2c 20 53 45  (dstWalFD, 0, SE
23490 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 69  EK_SET);.      i
234a0 66 28 20 66 63 6f 70 79 66 69 6c 65 28 73 72 63  f( fcopyfile(src
234b0 57 61 6c 46 44 2c 20 64 73 74 57 61 6c 46 44 2c  WalFD, dstWalFD,
234c0 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41 54   s, COPYFILE_DAT
234d0 41 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  A) ){.        in
234e0 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
234f0 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
23500 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   {.          cas
23510 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20  e ENOMEM:.      
23520 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23530 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
23540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23550 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
23560 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
23570 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
23580 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20   err);.         
23590 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
235a0 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
235b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
235c0 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65  pyfile_state_fre
235d0 65 28 73 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  e(s);.      clos
235e0 65 28 64 73 74 57 61 6c 46 44 29 3b 0a 20 20 20  e(dstWalFD);.   
235f0 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 73 72 63   }.    close(src
23600 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20 20 69 66  WalFD);.  }.  if
23610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23620 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66 6f 72 65  ){.    /* before
23630 20 77 65 20 63 6f 70 79 2c 20 65 6e 73 75 72 65   we copy, ensure
23640 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
23650 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 69  hange counter wi
23660 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65 64 20 2a  ll be modified *
23670 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 73  /.    uint32_t s
23680 72 63 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  rcChange = 0;.  
23690 20 20 75 69 6e 74 33 32 5f 74 20 64 73 74 43 68    uint32_t dstCh
236a0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 72  ange = 0;.    pr
236b0 65 61 64 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c  ead(pSrcFile->h,
236c0 20 26 73 72 63 43 68 61 6e 67 65 2c 20 34 2c 20   &srcChange, 4, 
236d0 32 34 29 3b 0a 20 20 20 20 70 72 65 61 64 28 70  24);.    pread(p
236e0 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68 61  File->h, &dstCha
236f0 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20  nge, 4, 24);.   
23700 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 74 68   .    /* copy th
23710 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
23720 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20 63 6f 70  e */.    s = cop
23730 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f  yfile_state_allo
23740 63 28 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70  c();.    lseek(p
23750 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53  SrcFile->h, 0, S
23760 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 6c 73  EEK_SET);.    ls
23770 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 30 2c  eek(pFile->h, 0,
23780 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
23790 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28 70 53  if( fcopyfile(pS
237a0 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65  rcFile->h, pFile
237b0 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45  ->h, s, COPYFILE
237c0 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20 20 20  _DATA) ){.      
237d0 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20  int err=errno;. 
237e0 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
237f0 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   {.        case 
23800 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20  ENOMEM:.        
23810 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
23820 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  MEM;.          b
23830 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
23840 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
23850 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
23860 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20  pFile, err);.   
23870 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23880 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
23890 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 70 79  }.    }.    copy
238a0 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65 65 28  file_state_free(
238b0 73 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 20  s);.    .    if 
238c0 28 73 72 63 43 68 61 6e 67 65 20 3d 3d 20 64 73  (srcChange == ds
238d0 74 43 68 61 6e 67 65 29 20 7b 0a 20 20 20 20 20  tChange) {.     
238e0 20 2f 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 63   /* modify the c
238f0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
23900 20 66 6f 72 63 65 20 70 61 67 65 20 7a 65 72 6f   force page zero
23910 20 74 6f 20 62 65 20 72 65 6c 6f 61 64 65 64 20   to be reloaded 
23920 2a 2f 0a 20 20 20 20 20 20 64 73 74 43 68 61 6e  */.      dstChan
23930 67 65 20 2b 2b 3b 0a 20 20 20 20 20 20 70 77 72  ge ++;.      pwr
23940 69 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64  ite(pFile->h, &d
23950 73 74 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29  stChange, 4, 24)
23960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
23970 28 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 29  ( isSrcCorrupt )
23980 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
23990 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f  o_superunlock_co
239a0 72 72 75 70 74 28 73 72 63 5f 66 69 6c 65 2c 20  rrupt(src_file, 
239b0 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f  corruptSrcFileLo
239c0 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ck);.  }else{.  
239d0 20 20 2f 2a 20 64 6f 6e 65 20 77 69 74 68 20 74    /* done with t
239e0 68 65 20 73 6f 75 72 63 65 20 64 62 20 73 6f 20  he source db so 
239f0 65 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  end the transact
23a00 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ion */.    sqlit
23a10 65 33 5f 65 78 65 63 28 73 72 63 64 62 32 2c 20  e3_exec(srcdb2, 
23a20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
23a30 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 7a 65 72  0);.  }.  /* zer
23a40 6f 20 6f 75 74 20 61 6e 79 20 6f 6c 64 20 6a 6f  o out any old jo
23a50 75 72 6e 61 6c 20 63 6c 75 74 74 65 72 20 2a 2f  urnal clutter */
23a60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
23a80 73 6b 69 70 57 41 4c 20 3d 20 28 73 72 63 57 61  skipWAL = (srcWa
23a90 6c 46 44 3c 30 29 3f 30 3a 31 3b 0a 20 20 20 20  lFD<0)?0:1;.    
23aa0 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75  unixInvalidateSu
23ab0 70 70 6f 72 74 46 69 6c 65 73 28 70 46 69 6c 65  pportFiles(pFile
23ac0 2c 20 73 6b 69 70 57 41 4c 29 3b 0a 20 20 7d 0a  , skipWAL);.  }.
23ad0 20 20 0a 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64    .end_replace_d
23ae0 61 74 61 62 61 73 65 3a 0a 20 20 69 66 28 20 70  atabase:.  if( p
23af0 53 72 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20  SrcBtree ){.    
23b00 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 72  sqlite3_close(sr
23b10 63 64 62 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  cdb2);.    sqlit
23b20 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 53 72  e3BtreeLeave(pSr
23b30 63 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73  cBtree);.  }.  s
23b40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
23b50 76 65 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29  ve(srcdb->mutex)
23b60 3b 0a 20 20 69 66 28 20 69 73 44 73 74 43 6f 72  ;.  if( isDstCor
23b70 72 75 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  rupt ){.    sqli
23b80 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
23b90 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20  ock_corrupt(id, 
23ba0 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f  corruptDstFileLo
23bb0 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ck);.  }else{.  
23bc0 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
23bd0 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29  perunlock(pLock)
23be0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23bf0 63 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 53 51 4c  c;.}.#define SQL
23c00 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f  ITE_FILE_HEADER_
23c10 4c 45 4e 20 31 36 0a 2f 2a 20 43 68 65 63 6b 20  LEN 16./* Check 
23c20 66 6f 72 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e  for a conflictin
23c30 67 20 6c 6f 63 6b 2e 20 20 49 66 20 6f 6e 65 20  g lock.  If one 
23c40 69 73 20 66 6f 75 6e 64 2c 20 70 72 69 6e 74 20  is found, print 
23c50 61 6e 20 74 68 69 73 0a 20 2a 2a 20 6f 6e 20 73  an this. ** on s
23c60 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20 75  tandard output u
23c70 73 69 6e 67 20 74 68 65 20 66 6f 72 6d 61 74 20  sing the format 
23c80 73 74 72 69 6e 67 20 67 69 76 65 6e 20 61 6e 64  string given and
23c90 20 72 65 74 75 72 6e 20 31 2e 0a 20 2a 2a 20 49   return 1.. ** I
23ca0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 63  f there are no c
23cb0 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 73  onflicting locks
23cc0 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 2a 2f 0a  , return 0.. */.
23cd0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49  static int unixI
23ce0 73 4c 6f 63 6b 65 64 28 0a 20 20 70 69 64 5f 74  sLocked(.  pid_t
23cf0 20 70 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   pid,           
23d00 20 2f 2a 20 50 49 44 20 74 6f 20 74 65 73 74 20   /* PID to test 
23d10 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e 65 72 20 2a  for lock owner *
23d20 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
23d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
23d40 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
23d50 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 74  check */.  int t
23d60 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
23d70 20 2f 2a 20 46 5f 52 44 4c 43 4b 20 6f 72 20 46   /* F_RDLCK or F
23d80 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 75 6e 73 69  _WRLCK */.  unsi
23d90 67 6e 65 64 20 69 6e 74 20 69 4f 66 73 74 2c 20  gned int iOfst, 
23da0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
23db0 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  of the lock */. 
23dc0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43   unsigned int iC
23dd0 6e 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  nt,    /* Number
23de0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
23df0 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
23e00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
23e10 70 65 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f  pe     /* Type o
23e20 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  f lock */.){.  s
23e30 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6b 3b 0a  truct flock lk;.
23e40 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
23e50 6d 65 6d 73 65 74 28 26 6c 6b 2c 20 30 2c 20 73  memset(&lk, 0, s
23e60 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a 20 20 6c 6b  izeof(lk));.  lk
23e70 2e 6c 5f 74 79 70 65 20 3d 20 74 79 70 65 3b 0a  .l_type = type;.
23e80 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20    lk.l_whence = 
23e90 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6b 2e 6c  SEEK_SET;.  lk.l
23ea0 5f 73 74 61 72 74 20 3d 20 69 4f 66 73 74 3b 0a  _start = iOfst;.
23eb0 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d 20 69 43 6e    lk.l_len = iCn
23ec0 74 3b 0a 20 20 0a 20 20 69 66 28 20 70 69 64 21  t;.  .  if( pid!
23ed0 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54  =SQLITE_LOCKSTAT
23ee0 45 5f 41 4e 59 50 49 44 20 29 7b 0a 23 69 66 6e  E_ANYPID ){.#ifn
23ef0 64 65 66 20 46 5f 47 45 54 4c 4b 50 49 44 0a 23  def F_GETLKPID.#
23f00 20 77 61 72 6e 69 6e 67 20 46 5f 47 45 54 4c 4b   warning F_GETLK
23f10 50 49 44 20 75 6e 64 65 66 69 6e 65 64 2c 20 5f  PID undefined, _
23f20 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73 74 61 74  sqlite3_lockstat
23f30 65 20 66 61 6c 6c 69 6e 67 20 62 61 63 6b 20 74  e falling back t
23f40 6f 20 46 5f 47 45 54 4c 4b 0a 20 20 20 20 65 72  o F_GETLK.    er
23f50 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47  r = fcntl(h, F_G
23f60 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 23 65 6c 73  ETLK, &lk);.#els
23f70 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70 69 64 20 3d  e.    lk.l_pid =
23f80 20 70 69 64 3b 0a 20 20 20 20 65 72 72 20 3d 20   pid;.    err = 
23f90 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b  fcntl(h, F_GETLK
23fa0 50 49 44 2c 20 26 6c 6b 29 3b 0a 23 65 6e 64 69  PID, &lk);.#endi
23fb0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  f.  }else{.    e
23fc0 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f  rr = fcntl(h, F_
23fd0 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 20 20 7d  GETLK, &lk);.  }
23fe0 0a 20 20 0a 20 20 69 66 28 20 65 72 72 3d 3d 28  .  .  if( err==(
23ff0 2d 31 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  -1) ){.    fprin
24000 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 6e 74  tf(stderr, "fcnt
24010 6c 28 25 64 29 20 66 61 69 6c 65 64 3a 20 65 72  l(%d) failed: er
24020 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c 20 65 72  rno=%d\n", h, er
24030 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
24040 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66   -1;.  }.  .  if
24050 28 20 6c 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  ( lk.l_type!=F_U
24060 4e 4c 43 4b 20 26 26 20 28 70 69 64 3d 3d 53 51  NLCK && (pid==SQ
24070 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41  LITE_LOCKSTATE_A
24080 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e 6c 5f 70 69  NYPID || lk.l_pi
24090 64 3d 3d 70 69 64 29 20 29 7b 0a 23 69 66 64 65  d==pid) ){.#ifde
240a0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
240b0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
240c0 72 2c 20 22 25 73 20 6c 6f 63 6b 20 68 65 6c 64  r, "%s lock held
240d0 20 62 79 20 25 64 5c 6e 22 2c 20 7a 54 79 70 65   by %d\n", zType
240e0 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f 70 69 64 29  , (int)lk.l_pid)
240f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
24100 75 72 6e 20 31 3b 0a 20 20 7d 20 0a 20 20 72 65  urn 1;.  } .  re
24110 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
24120 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 73 74  c int unixLockst
24130 61 74 65 50 69 64 28 75 6e 69 78 46 69 6c 65 20  atePid(unixFile 
24140 2a 2c 20 70 69 64 5f 74 2c 20 69 6e 74 20 2a 29  *, pid_t, int *)
24150 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51  ;..#endif /* (SQ
24160 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
24170 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
24180 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
24190 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  /.../*.** If *pA
241a0 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  rg is initially 
241b0 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
241c0 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
241d0 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
241e0 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
241f0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
24200 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
24210 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
24220 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
24230 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
24240 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
24250 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
24260 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
24270 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
24280 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74  void unixModeBit
24290 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
242a0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
242b0 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
242c0 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
242d0 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
242e0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
242f0 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
24300 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
24310 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
24320 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
24330 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
24340 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
24350 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
24360 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
24370 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
24380 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
24390 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
243a0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a  f, char *zBuf);.
243b0 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
243c0 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
243d0 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
243e0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
243f0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
24400 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
24410 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
24420 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
24430 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
24440 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
24450 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 23   switch( op ){.#
24460 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  if defined(__lin
24470 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ux__) && defined
24480 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42  (SQLITE_ENABLE_B
24490 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ATCH_ATOMIC_WRIT
244a0 45 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E).    case SQLI
244b0 54 45 5f 46 43 4e 54 4c 5f 42 45 47 49 4e 5f 41  TE_FCNTL_BEGIN_A
244c0 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20  TOMIC_WRITE: {. 
244d0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73       int rc = os
244e0 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Ioctl(pFile->h, 
244f0 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f 41  F2FS_IOC_START_A
24500 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20 20  TOMIC_WRITE);.  
24510 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20      return rc ? 
24520 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 45 47  SQLITE_IOERR_BEG
24530 49 4e 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49  IN_ATOMIC : SQLI
24540 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
24550 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
24560 54 4c 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43  TL_COMMIT_ATOMIC
24570 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  _WRITE: {.      
24580 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c  int rc = osIoctl
24590 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f  (pFile->h, F2FS_
245a0 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  IOC_COMMIT_ATOMI
245b0 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20  C_WRITE);.      
245c0 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
245d0 54 45 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f  TE_IOERR_COMMIT_
245e0 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f  ATOMIC : SQLITE_
245f0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
24600 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
24610 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 5f  ROLLBACK_ATOMIC_
24620 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69  WRITE: {.      i
24630 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28  nt rc = osIoctl(
24640 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49  pFile->h, F2FS_I
24650 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c  OC_ABORT_VOLATIL
24660 45 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20  E_WRITE);.      
24670 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
24680 54 45 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42 41 43  TE_IOERR_ROLLBAC
24690 4b 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54  K_ATOMIC : SQLIT
246a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
246b0 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20  if /* __linux__ 
246c0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
246d0 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
246e0 49 54 45 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ITE */..    case
246f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
24700 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
24710 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
24720 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  File->eFileLock;
24730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
24740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24750 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24760 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  CNTL_LAST_ERRNO:
24770 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
24780 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  pArg = pFile->la
24790 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
247a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
247b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
247c0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
247d0 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
247e0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
247f0 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
24800 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24810 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
24820 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
24830 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
24840 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
24850 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
24860 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
24870 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53       rc = fcntlS
24880 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a  izeHint(pFile, *
24890 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20  (i64 *)pArg);.  
248a0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
248b0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
248c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
248d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
248e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
248f0 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
24900 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c  unixModeBit(pFil
24910 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53  e, UNIXFILE_PERS
24920 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70  IST_WAL, (int*)p
24930 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Arg);.      retu
24940 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24950 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
24960 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
24970 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b  AFE_OVERWRITE: {
24980 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
24990 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
249a0 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
249b0 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Arg);.      retu
249c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
249d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
249e0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
249f0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61  E: {.      *(cha
24a00 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  r**)pArg = sqlit
24a10 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
24a20 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e   pFile->pVfs->zN
24a30 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
24a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24a50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
24a60 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
24a70 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
24a80 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73  char *zTFile = s
24a90 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
24aa0 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78   pFile->pVfs->mx
24ab0 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Pathname );.    
24ac0 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a    if( zTFile ){.
24ad0 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74 54          unixGetT
24ae0 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  empname(pFile->p
24af0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
24b00 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20   zTFile);.      
24b10 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
24b20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20  = zTFile;.      
24b30 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
24b40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
24b50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24b60 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a  FCNTL_HAS_MOVED:
24b70 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
24b80 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f  pArg = fileHasMo
24b90 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ved(pFile);.    
24ba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24bb0 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  OK;.    }.#if SQ
24bc0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
24bd0 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
24be0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
24bf0 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
24c00 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
24c10 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
24c20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24c30 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
24c40 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
24c50 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
24c60 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
24c70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
24c80 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
24c90 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ap;.      }..   
24ca0 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
24cb0 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61 79 20  of newLimit may 
24cc0 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  be eventually ca
24cd0 73 74 20 74 6f 20 28 73 69 7a 65 5f 74 29 20 61  st to (size_t) a
24ce0 6e 64 20 70 61 73 73 65 64 0a 20 20 20 20 20 20  nd passed.      
24cf0 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e 20 52 65  ** to mmap(). Re
24d00 73 74 72 69 63 74 20 69 74 73 20 76 61 6c 75 65  strict its value
24d10 20 74 6f 20 32 47 42 20 69 66 20 28 73 69 7a 65   to 2GB if (size
24d20 5f 74 29 20 69 73 20 6e 6f 74 20 61 74 20 6c 65  _t) is not at le
24d30 61 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 36  ast a.      ** 6
24d40 34 2d 62 69 74 20 74 79 70 65 2e 20 2a 2f 0a 20  4-bit type. */. 
24d50 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
24d60 74 3e 30 20 26 26 20 73 69 7a 65 6f 66 28 73 69  t>0 && sizeof(si
24d70 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20 20 20 20  ze_t)<8 ){.     
24d80 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 28 6e     newLimit = (n
24d90 65 77 4c 69 6d 69 74 20 26 20 30 78 37 46 46 46  ewLimit & 0x7FFF
24da0 46 46 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  FFFF);.      }..
24db0 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
24dc0 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
24dd0 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
24de0 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
24df0 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
24e00 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
24e10 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
24e20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
24e30 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
24e40 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
24e50 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
24e60 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
24e70 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e            unixUn
24e80 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
24e90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
24ea0 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
24eb0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
24ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
24ed0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24ee0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
24ef0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
24f00 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
24f10 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
24f20 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
24f30 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
24f40 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
24f50 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
24f60 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
24f70 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
24f80 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
24f90 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
24fa0 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
24fb0 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
24fc0 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
24fd0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
24fe0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
24ff0 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
25000 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
25010 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
25020 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
25030 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
25040 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
25050 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
25060 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
25070 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
25080 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
25090 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
250a0 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
250b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
250c0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
250d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
250e0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
250f0 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
25100 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
25110 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25120 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
25130 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
25140 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
25150 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
25160 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
25170 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
25180 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 52 55  SQLITE_FCNTL_TRU
25190 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 3a 20  NCATE_DATABASE: 
251a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
251b0 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62  nixTruncateDatab
251c0 61 73 65 28 70 46 69 6c 65 2c 20 28 70 41 72 67  ase(pFile, (pArg
251d0 20 3f 20 28 2a 28 69 6e 74 20 2a 29 70 41 72 67   ? (*(int *)pArg
251e0 29 20 3a 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  ) : 0));.    }. 
251f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
25200 43 4e 54 4c 5f 52 45 50 4c 41 43 45 5f 44 41 54  CNTL_REPLACE_DAT
25210 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 72  ABASE: {.      r
25220 65 74 75 72 6e 20 75 6e 69 78 52 65 70 6c 61 63  eturn unixReplac
25230 65 44 61 74 61 62 61 73 65 28 70 46 69 6c 65 2c  eDatabase(pFile,
25240 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41 72 67   (sqlite3 *)pArg
25250 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
25260 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
25270 4f 43 4b 53 54 41 54 45 5f 50 49 44 3a 20 7b 0a  OCKSTATE_PID: {.
25280 20 20 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50        LockstateP
25290 49 44 20 2a 70 4c 6f 63 6b 73 74 61 74 65 3b 0a  ID *pLockstate;.
252a0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
252b0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 70      .      if( p
252c0 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Arg==NULL ){.   
252d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
252e0 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20  TE_MISUSE;.     
252f0 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b 73 74   }.      pLockst
25300 61 74 65 20 3d 20 28 4c 6f 63 6b 73 74 61 74 65  ate = (Lockstate
25310 50 49 44 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  PID *)pArg;.    
25320 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 73    rc = unixLocks
25330 74 61 74 65 50 69 64 28 70 46 69 6c 65 2c 20 70  tatePid(pFile, p
25340 4c 6f 63 6b 73 74 61 74 65 2d 3e 70 69 64 2c 20  Lockstate->pid, 
25350 26 28 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 73 74  &(pLockstate->st
25360 61 74 65 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ate));.      ret
25370 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
25380 20 20 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20 28      .#endif /* (
25390 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
253a0 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
253b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
253c0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
253d0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
253e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46  ;.}../*.** If pF
253f0 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  d->sectorSize is
25400 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74   non-zero when t
25410 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25420 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a  called, it is a.
25430 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77  ** no-op. Otherw
25440 69 73 65 2c 20 74 68 65 20 76 61 6c 75 65 73 20  ise, the values 
25450 6f 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  of pFd->sectorSi
25460 7a 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d 3e  ze and .** pFd->
25470 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
25480 73 74 69 63 73 20 61 72 65 20 73 65 74 20 61 63  stics are set ac
25490 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66  cording to the f
254a0 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 63  ile-system .** c
254b0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 20  haracteristics. 
254c0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
254d0 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
254e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
254f0 4f 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e 64 20  One for QNX and 
25500 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6f  one for all.** o
25510 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  ther systems..*/
25520 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54  .#ifndef __QNXNT
25530 4f 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  O__.static void 
25540 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74  setDeviceCharact
25550 65 72 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c  eristics(unixFil
25560 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72  e *pFd){.  asser
25570 74 28 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68  t( pFd->deviceCh
25580 61 72 61 63 74 65 72 69 73 74 69 63 73 3d 3d 30  aracteristics==0
25590 20 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72 53   || pFd->sectorS
255a0 69 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize!=0 );.  if( 
255b0 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d  pFd->sectorSize=
255c0 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
255d0 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
255e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
255f0 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
25600 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20 69 6e  IC_WRITE).    in
25610 74 20 72 65 73 3b 0a 20 20 20 20 75 33 32 20 66  t res;.    u32 f
25620 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68   = 0;..    /* Ch
25630 65 63 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 20  eck for support 
25640 66 6f 72 20 46 32 46 53 20 61 74 6f 6d 69 63 20  for F2FS atomic 
25650 62 61 74 63 68 20 77 72 69 74 65 73 2e 20 2a 2f  batch writes. */
25660 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 49 6f 63  .    res = osIoc
25670 74 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46 53 5f  tl(pFd->h, F2FS_
25680 49 4f 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53  IOC_GET_FEATURES
25690 2c 20 26 66 29 3b 0a 20 20 20 20 69 66 28 20 72  , &f);.    if( r
256a0 65 73 3d 3d 30 20 26 26 20 28 66 20 26 20 46 32  es==0 && (f & F2
256b0 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49  FS_FEATURE_ATOMI
256c0 43 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  C_WRITE) ){.    
256d0 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61    pFd->deviceCha
256e0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 53  racteristics = S
256f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43  QLITE_IOCAP_BATC
25700 48 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d 0a  H_ATOMIC;.    }.
25710 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
25720 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  x__ && SQLITE_EN
25730 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
25740 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20  C_WRITE */..    
25750 2f 2a 20 53 65 74 20 74 68 65 20 50 4f 57 45 52  /* Set the POWER
25760 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 66  SAFE_OVERWRITE f
25770 6c 61 67 20 69 66 20 72 65 71 75 65 73 74 65 64  lag if requested
25780 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 64  . */.    if( pFd
25790 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
257a0 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20  IXFILE_PSOW ){. 
257b0 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65       pFd->device
257c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
257d0 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  |= SQLITE_IOCAP_
257e0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
257f0 49 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ITE;.    }..    
25800 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  pFd->sectorSize 
25810 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
25820 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
25830 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75  }.}.#else.#inclu
25840 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b  de <sys/dcmd_blk
25850 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
25860 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61  s/statvfs.h>.sta
25870 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69  tic void setDevi
25880 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
25890 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
258a0 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
258b0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
258c0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
258d0 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
258e0 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
258f0 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
25900 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
25910 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
25920 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
25930 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
25940 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
25950 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
25960 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25970 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
25980 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
25990 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
259a0 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
259b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
259c0 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
259d0 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
259e0 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
259f0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
25a00 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
25a10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
25a20 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25a30 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
25a40 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
25a50 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
25a60 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
25a70 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
25a80 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
25a90 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
25aa0 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
25ab0 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
25ac0 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
25ad0 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
25b00 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
25b10 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
25b20 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
25b30 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
25b40 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
25b50 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
25b60 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
25b90 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
25ba0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
25bb0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
25bc0 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
25bd0 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
25be0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
25bf0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
25c00 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
25c10 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
25c20 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
25c30 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
25c40 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
25c50 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
25c60 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
25c70 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
25c80 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
25c90 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
25ca0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
25cb0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
25cc0 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
25cd0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
25ce0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d10 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
25d20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
25d30 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
25d40 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
25d50 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
25d60 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
25d70 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25da0 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
25db0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
25dc0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
25dd0 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
25de0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
25df0 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
25e00 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
25e10 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
25e20 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
25e30 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25e40 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
25e50 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
25e60 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
25e70 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
25e80 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
25e90 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
25ea0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
25eb0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
25ec0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
25ed0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
25ee0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f00 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
25f10 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
25f20 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
25f30 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
25f40 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
25f50 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
25f60 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
25f70 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
25f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f90 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
25fa0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
25fb0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
25fc0 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
25fd0 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
25fe0 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
25ff0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
26000 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
26010 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
26020 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
26030 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
26040 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
26050 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
26060 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
26070 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
26080 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
26090 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
260a0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
260b0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
260c0 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
260d0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
260e0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
260f0 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
26100 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
26110 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
26150 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
26160 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
26170 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
26180 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
26190 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
261a0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
261b0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
261c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
261d0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
261e0 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
261f0 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
26200 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
26210 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
26220 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
26230 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
26240 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
26250 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
26260 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
26270 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
26280 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
26290 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
262a0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
262b0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
262c0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
262f0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
26300 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
26310 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
26320 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
26330 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
26340 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
26350 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
26360 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
26370 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
26380 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
26390 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
263a0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
263b0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
263c0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
263f0 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
26400 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
26410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
26420 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
26430 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
26440 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
26450 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
26460 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
26470 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
26480 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
26490 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
264a0 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
264b0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
264c0 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
264d0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
264e0 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
264f0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
26500 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
26510 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26520 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
26530 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
26540 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
26550 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
26560 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
26570 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
26580 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
26590 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
265a0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
265b0 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
265c0 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
265d0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
265e0 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
265f0 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
26600 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
26610 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
26620 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
26630 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
26640 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
26650 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
26660 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
26670 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
26680 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
26690 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
266a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
266b0 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
266c0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
266d0 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
266e0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
266f0 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74  setDeviceCharact
26700 65 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a 20  eristics(pFd);. 
26710 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 73 65 63   return pFd->sec
26720 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  torSize;.}../*.*
26730 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
26740 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
26750 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
26760 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53  ..**.** This VFS
26770 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65   is set up to re
26780 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
26790 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
267a0 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74  WRITE by default
267b0 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68  ..** However, th
267c0 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e  at choice is con
267d0 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65  troversial since
267e0 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   technically the
267f0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66   underlying.** f
26800 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ile system does 
26810 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69  not always provi
26820 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65  de powersafe ove
26830 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74  rwrites.  (In ot
26840 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66  her.** words, af
26850 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73  ter a power-loss
26860 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66   event, parts of
26870 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
26880 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69  ere never.** wri
26890 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75  tten might end u
268a0 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  p being altered.
268b0 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d  )  However, non-
268c0 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73  PSOW behavior is
268d0 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72   very,.** very r
268e0 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74  are.  And assert
268f0 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61  ing PSOW makes a
26900 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e   large reduction
26910 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   in the amount.*
26920 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f  * of required I/
26930 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67  O for journaling
26940 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66  , since a lot of
26950 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d   padding is elim
26960 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63  inated..**  Henc
26970 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41  e, while POWERSA
26980 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  FE_OVERWRITE is 
26990 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  on by default, t
269a0 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63  here is a file-c
269b0 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61  ontrol.** availa
269c0 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
269d0 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79  ff and URI query
269e0 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c   parameter avail
269f0 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
26a00 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
26a10 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
26a20 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
26a30 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
26a40 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
26a50 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
26a60 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61 72  .  setDeviceChar
26a70 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29  acteristics(pFd)
26a80 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e  ;.  return pFd->
26a90 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
26aa0 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21 64  stics;.}..#if !d
26ab0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
26ac0 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
26ad0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
26ae0 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0../*.** Return 
26af0 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
26b00 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
26b10 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
26b20 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64   not be called d
26b30 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72  irectly by other
26b40 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
26b50 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  le. .** Instead,
26b60 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61   it should be ca
26b70 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f  lled via macro o
26b80 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a  sGetpagesize()..
26b90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
26ba0 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
26bb0 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  id){.#if OS_VXWO
26bc0 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32  RKS.  return 102
26bd0 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  4;.#elif defined
26be0 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20  (_BSD_SOURCE).  
26bf0 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69  return getpagesi
26c00 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65  ze();.#else.  re
26c10 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e  turn (int)syscon
26c20 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b  f(_SC_PAGESIZE);
26c30 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69  .#endif.}..#endi
26c40 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
26c50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
26c60 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
26c70 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66  P_SIZE>0 */..#if
26c80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26c90 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  _WAL../*.** Obje
26ca0 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
26cb0 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d  sent an shared m
26cc0 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a  emory buffer.  .
26cd0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69  **.** When multi
26ce0 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
26cf0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
26d00 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61  me wal-index, ea
26d10 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73  ch thread.** has
26d20 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d   its own unixShm
26d30 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
26d40 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  y all point to a
26d50 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
26d60 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78  .** of this unix
26d70 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20  ShmNode object. 
26d80 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
26d90 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20   each wal-index 
26da0 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c  is opened.** onl
26db0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
26dc0 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75  ss..**.** Each u
26dd0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
26de0 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  t is connected t
26df0 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49  o a single unixI
26e00 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
26e10 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61  .** We could coa
26e20 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63  lesce this objec
26e30 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65  t into unixInode
26e40 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77  Info, but that w
26e50 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65  ould mean.** eve
26e60 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61  ry open file tha
26e70 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  t does not use s
26e80 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e  hared memory (in
26e90 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f   other words, mo
26ea0 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73  st.** open files
26eb0 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  ) would have to 
26ec0 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69  carry around thi
26ed0 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  s extra informat
26ee0 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20  ion.  So.** the 
26ef0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
26f00 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
26f10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
26f20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
26f30 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e  ct.** and the un
26f40 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
26f50 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79   is created only
26f60 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a   when needed..**
26f70 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
26f80 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
26f90 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
26fa0 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
26fb0 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
26fc0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
26fd0 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
26fe0 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
26ff0 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
27000 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
27010 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
27020 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
27030 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
27040 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
27050 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
27060 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
27070 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d  er unixShmNode.m
27080 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
27090 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  d or unixShmNode
270a0 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
270b0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
270c0 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
270d0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
270e0 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
270f0 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
27100 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
27110 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20  unixShmNode {.  
27120 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
27130 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e  Inode;     /* un
27140 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74  ixInodeInfo that
27150 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e   owns this SHM n
27160 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
27170 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
27180 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
27190 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
271a0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
271b0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
271c0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
271d0 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  e mmapped file *
271e0 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27200 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
27210 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
27220 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
27230 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
27240 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
27250 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36  regions */.  u16
27260 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
27270 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
27280 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
27290 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64  n */.  u8 isRead
272a0 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  only;           
272b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
272c0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 69  d-only */.  u8 i
272d0 73 55 6e 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20  sUnlocked;      
272e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
272f0 66 20 6e 6f 20 44 4d 53 20 6c 6f 63 6b 20 68 65  f no DMS lock he
27300 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ld */.  char **a
27310 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  pRegion;        
27320 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
27330 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  apped shared-mem
27340 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
27350 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
27360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27370 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d  umber of unixShm
27380 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
27390 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75  g to this */.  u
273a0 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  nixShm *pFirst; 
273b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
273c0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
273d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
273e0 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
273f0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78  TE_DEBUG.  u8 ex
27400 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
27410 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
27420 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
27430 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68   held */.  u8 sh
27440 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
27450 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
27460 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
27470 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53  ld */.  u8 nextS
27480 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
27490 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
274a0 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20  able unixShm.id 
274b0 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
274c0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  };../*.** Struct
274d0 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
274e0 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
274f0 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
27500 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
27510 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
27520 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
27530 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
27540 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
27550 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
27560 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
27570 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
27580 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
27590 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69  er:.**.**    uni
275a0 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20  xShm.pFile.**   
275b0 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a   unixShm.id.**.*
275c0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
275d0 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
275e0 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e  e.  The unixShm.
275f0 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73  pFile->mutex mus
27600 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
27610 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
27620 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
27630 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ds..*/.struct un
27640 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68  ixShm {.  unixSh
27650 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
27660 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
27670 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f  rlying unixShmNo
27680 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  de object */.  u
27690 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  nixShm *pNext;  
276a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
276b0 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74  t unixShm with t
276c0 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e  he same unixShmN
276d0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
276e0 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
276f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
27700 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53  olding the unixS
27710 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
27720 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27740 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
27750 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73  ction within its
27760 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
27770 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
27780 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
27790 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
277a0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
277b0 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
277c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
277d0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
277e0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a  ocks held */.};.
277f0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
27800 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
27810 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
27820 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
27830 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
27840 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
27850 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
27860 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
27870 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
27880 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
27890 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
278a0 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
278b0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
278c0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
278d0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
278e0 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
278f0 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
27900 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
27910 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
27920 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
27930 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
27940 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
27950 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
27960 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
27970 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46 69  emLock(.  unixFi
27980 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
27990 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74   /* Open connect
279a0 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66  ion to the WAL f
279b0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ile */.  int loc
279c0 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  kType,          
279d0 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44  /* F_UNLCK, F_RD
279e0 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20  LCK, or F_WRLCK 
279f0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
27a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27a10 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
27a20 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a   locking range *
27a30 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20  /.  int n       
27a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27a50 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
27a60 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e   lock */.){.  un
27a70 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
27a80 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ode; /* Apply lo
27a90 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
27aa0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
27ab0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72 75  egment */.  stru
27ac0 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20  ct flock f;     
27ad0 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
27ae0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
27af0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
27b00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27b10 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c 74  OK;    /* Result
27b20 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c   code form fcntl
27b30 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
27b40 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
27b50 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
27b60 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
27b70 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70 53  e caller */.  pS
27b80 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  hmNode = pFile->
27b90 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
27ba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
27bb0 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c  Node->nRef==0 ||
27bc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27bd0 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
27be0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 68  tex) );..  /* Sh
27bf0 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72  ared locks never
27c00 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20   span more than 
27c10 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73  one byte */.  as
27c20 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f  sert( n==1 || lo
27c30 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20  ckType!=F_RDLCK 
27c40 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61  );..  /* Locks a
27c50 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20  re within range 
27c60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  */.  assert( n>=
27c70 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45 5f 53  1 && n<=SQLITE_S
27c80 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  HM_NLOCK );..  i
27c90 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
27ca0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  0 ){.    /* Init
27cb0 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
27cc0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
27cd0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
27ce0 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
27cf0 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f     f.l_type = lo
27d00 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f  ckType;.    f.l_
27d10 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
27d20 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74  T;.    f.l_start
27d30 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c   = ofst;.    f.l
27d40 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72  _len = n;..    r
27d50 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  c = osFcntl(pShm
27d60 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  Node->h, F_SETLK
27d70 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  , &f);.    rc = 
27d80 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c  (rc!=(-1)) ? SQL
27d90 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
27da0 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BUSY;.  }..  /* 
27db0 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
27dc0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
27dd0 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
27de0 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
27df0 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
27e00 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
27e10 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
27e20 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33  .  mask = ofst>3
27e30 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c  1 ? 0xffff : (1<
27e40 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
27e50 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63  <ofst);.  if( rc
27e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27e70 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
27e80 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
27e90 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
27ea0 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
27eb0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
27ec0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
27ed0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
27ee0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
27ef0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
27f00 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
27f10 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
27f20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
27f30 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  ad-lock %d ok", 
27f40 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
27f50 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
27f60 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
27f70 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
27f80 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
27f90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27fa0 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
27fb0 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
27fc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
27fd0 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  te-lock %d ok", 
27fe0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
27ff0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
28000 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
28010 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
28020 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
28030 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
28040 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
28050 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
28060 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
28070 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
28080 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st));.    }else 
28090 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
280a0 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
280b0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
280c0 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
280d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
280e0 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
280f0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
28100 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
28110 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  e-lock %d failed
28120 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
28130 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
28140 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  " - afterwards %
28150 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
28160 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
28170 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53  ->sharedMask, pS
28180 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
28190 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
281a0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
281b0 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65      .}../*.** Re
281c0 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d  turn the minimum
281d0 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20   number of 32KB 
281e0 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74  shm regions that
281f0 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65   should be mappe
28200 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20  d at.** a time, 
28210 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61  assuming that ea
28220 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  ch mapping must 
28230 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  be an integer mu
28240 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a  ltiple of the.**
28250 20 63 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20   current system 
28260 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page-size..**.**
28270 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
28280 73 20 31 2e 20 54 68 65 20 65 78 63 65 70 74 69  s 1. The excepti
28290 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73  on seems to be s
282a0 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65 20  ystems that are 
282b0 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f  configured.** to
282c0 20 75 73 65 20 36 34 4b 42 20 70 61 67 65 73 20   use 64KB pages 
282d0 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 65  - in this case e
282e0 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  ach mapping must
282f0 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20   cover at least 
28300 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f  two.** shm regio
28310 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
28320 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  t unixShmRegionP
28330 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69  erMap(void){.  i
28340 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30  nt shmsz = 32*10
28350 32 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  24;            /
28360 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a  * SHM region siz
28370 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
28380 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  = osGetpagesize(
28390 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70  );   /* System p
283a0 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73  age size */.  as
283b0 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26  sert( ((pgsz-1)&
283c0 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a  pgsz)==0 );   /*
283d0 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   Page size must 
283e0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
283f0 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68  */.  if( pgsz<sh
28400 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  msz ) return 1;.
28410 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68    return pgsz/sh
28420 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75  msz;.}../*.** Pu
28430 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
28440 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
28450 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
28460 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
28470 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
28480 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
28490 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
284a0 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
284b0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
284c0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
284d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
284e0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
284f0 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
28500 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
28510 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
28520 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
28530 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
28540 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
28550 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
28560 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65  && ALWAYS(p->nRe
28570 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  f==0) ){.    int
28580 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
28590 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
285a0 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p();.    int i;.
285b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
285c0 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f  Inode==pFd->pIno
285d0 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  de );.    sqlite
285e0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
285f0 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28  mutex);.    for(
28600 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
28610 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70  n; i+=nShmPerMap
28620 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
28630 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
28640 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65  osMunmap(p->apRe
28650 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65  gion[i], p->szRe
28660 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gion);.      }el
28670 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
28680 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
28690 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20  gion[i]);.      
286a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
286b0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
286c0 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
286d0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
286e0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64  robust_close(pFd
286f0 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  , p->h, __LINE__
28700 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20  );.      p->h = 
28710 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  -1;.    }.    p-
28720 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
28730 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
28740 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
28750 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53  }../*.** The DMS
28760 20 6c 6f 63 6b 20 68 61 73 20 6e 6f 74 20 79 65   lock has not ye
28770 74 20 62 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20  t been taken on 
28780 73 68 6d 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64  shm file pShmNod
28790 65 2e 20 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  e. Attempt to.**
287a0 20 74 61 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65   take it now. Re
287b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
287c0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
287d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
287e0 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
287f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
28800 20 44 4d 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c   DMS cannot be l
28810 6f 63 6b 65 64 20 62 65 63 61 75 73 65 20 74 68  ocked because th
28820 69 73 20 69 73 20 61 20 72 65 61 64 6f 6e 6c 79  is is a readonly
28830 5f 73 68 6d 3d 31 20 0a 2a 2a 20 63 6f 6e 6e 65  _shm=1 .** conne
28840 63 74 69 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74 68  ction and no oth
28850 65 72 20 70 72 6f 63 65 73 73 20 61 6c 72 65 61  er process alrea
28860 64 79 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c  dy holds a lock,
28870 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
28880 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49  E_READONLY_CANTI
28890 4e 49 54 20 61 6e 64 20 73 65 74 20 70 53 68 6d  NIT and set pShm
288a0 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64  Node->isUnlocked
288b0 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  =1..*/.static in
288c0 74 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  t unixLockShared
288d0 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20  Memory(unixFile 
288e0 2a 70 44 62 46 64 2c 20 75 6e 69 78 53 68 6d 4e  *pDbFd, unixShmN
288f0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 29 7b 0a  ode *pShmNode){.
28900 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
28910 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
28920 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
28930 20 55 73 65 20 46 5f 47 45 54 4c 4b 20 74 6f 20   Use F_GETLK to 
28940 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f  determine the lo
28950 63 6b 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  cks other proces
28960 73 65 73 20 61 72 65 20 68 6f 6c 64 69 6e 67 0a  ses are holding.
28970 20 20 2a 2a 20 6f 6e 20 74 68 65 20 44 4d 53 20    ** on the DMS 
28980 62 79 74 65 2e 20 49 66 20 69 74 20 69 6e 64 69  byte. If it indi
28990 63 61 74 65 73 20 74 68 61 74 20 61 6e 6f 74 68  cates that anoth
289a0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
289b0 6c 64 69 6e 67 0a 20 20 2a 2a 20 61 20 53 48 41  lding.  ** a SHA
289c0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  RED lock, then t
289d0 68 69 73 20 70 72 6f 63 65 73 73 20 6d 61 79 20  his process may 
289e0 61 6c 73 6f 20 74 61 6b 65 20 61 20 53 48 41 52  also take a SHAR
289f0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  ED lock.  ** and
28a00 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 6f 70   proceed with op
28a10 65 6e 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20  ening the *-shm 
28a20 66 69 6c 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  file. .  **.  **
28a30 20 4f 72 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72   Or, if no other
28a40 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
28a50 69 6e 67 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ing any lock, th
28a60 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 0a  en this process.
28a70 20 20 2a 2a 20 69 73 20 74 68 65 20 66 69 72 73    ** is the firs
28a80 74 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20 49 6e  t to open it. In
28a90 20 74 68 69 73 20 63 61 73 65 20 74 61 6b 65 20   this case take 
28aa0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
28ab0 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 44 4d  k on the.  ** DM
28ac0 53 20 62 79 74 65 20 61 6e 64 20 74 72 75 6e 63  S byte and trunc
28ad0 61 74 65 20 74 68 65 20 2a 2d 73 68 6d 20 66 69  ate the *-shm fi
28ae0 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
28af0 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 6e 0a 20   in size. Then. 
28b00 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 20 74 6f   ** downgrade to
28b10 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
28b20 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65 2e 0a  n the DMS byte..
28b30 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 6f    **.  ** If ano
28b40 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
28b50 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
28b60 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
28b70 20 44 4d 53 20 62 79 74 65 2c 0a 20 20 2a 2a 20   DMS byte,.  ** 
28b80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
28b90 53 59 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  SY to the caller
28ba0 20 28 69 74 20 77 69 6c 6c 20 74 72 79 20 61 67   (it will try ag
28bb0 61 69 6e 29 2e 20 41 6e 20 65 61 72 6c 69 65 72  ain). An earlier
28bc0 0a 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  .  ** version of
28bd0 20 74 68 69 73 20 63 6f 64 65 20 61 74 74 65 6d   this code attem
28be0 70 74 65 64 20 74 68 65 20 53 48 41 52 45 44 20  pted the SHARED 
28bf0 6c 6f 63 6b 20 61 74 20 74 68 69 73 20 70 6f 69  lock at this poi
28c00 6e 74 2e 20 42 75 74 0a 20 20 2a 2a 20 74 68 69  nt. But.  ** thi
28c10 73 20 69 6e 74 72 6f 64 75 63 65 64 20 61 20 73  s introduced a s
28c20 75 62 74 6c 65 20 72 61 63 65 20 63 6f 6e 64 69  ubtle race condi
28c30 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 70 72 6f  tion: if the pro
28c40 63 65 73 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a  cess holding.  *
28c50 2a 20 45 58 43 4c 55 53 49 56 45 20 66 61 69 6c  * EXCLUSIVE fail
28c60 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  ed just before t
28c70 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 2a 2d  runcating the *-
28c80 73 68 6d 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  shm file, then t
28c90 68 69 73 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  his.  ** process
28ca0 20 6d 69 67 68 74 20 6f 70 65 6e 20 61 6e 64 20   might open and 
28cb0 75 73 65 20 74 68 65 20 2a 2d 73 68 6d 20 66 69  use the *-shm fi
28cc0 6c 65 20 77 69 74 68 6f 75 74 20 74 72 75 6e 63  le without trunc
28cd0 61 74 69 6e 67 20 69 74 2e 0a 20 20 2a 2a 20 41  ating it..  ** A
28ce0 6e 64 20 69 66 20 74 68 65 20 2a 2d 73 68 6d 20  nd if the *-shm 
28cf0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f  file has been co
28d00 72 72 75 70 74 65 64 20 62 79 20 61 20 70 6f 77  rrupted by a pow
28d10 65 72 20 66 61 69 6c 75 72 65 20 6f 72 0a 20 20  er failure or.  
28d20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 2c  ** system crash,
28d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 74   the database it
28d40 73 65 6c 66 20 6d 61 79 20 61 6c 73 6f 20 62 65  self may also be
28d50 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 20 2a  come corrupt.  *
28d60 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  /.  lock.l_whenc
28d70 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
28d80 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 55  lock.l_start = U
28d90 4e 49 58 5f 53 48 4d 5f 44 4d 53 3b 0a 20 20 6c  NIX_SHM_DMS;.  l
28da0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
28db0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
28dc0 5f 57 52 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _WRLCK;.  if( os
28dd0 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fcntl(pShmNode->
28de0 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
28df0 6b 29 21 3d 30 20 29 20 7b 0a 20 20 20 20 72 63  k)!=0 ) {.    rc
28e00 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
28e10 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LOCK;.  }else if
28e20 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  ( lock.l_type==F
28e30 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 69 66  _UNLCK ){.    if
28e40 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  ( pShmNode->isRe
28e50 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adonly ){.      
28e60 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
28e70 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  cked = 1;.      
28e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
28e90 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3b 0a 20  ONLY_CANTINIT;. 
28ea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28eb0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
28ec0 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
28ed0 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  WRLCK, UNIX_SHM_
28ee0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  DMS, 1);.      i
28ef0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28f00 20 26 26 20 72 6f 62 75 73 74 5f 66 74 72 75 6e   && robust_ftrun
28f10 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
28f20 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
28f30 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
28f40 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
28f50 48 4d 4f 50 45 4e 2c 22 66 74 72 75 6e 63 61 74  HMOPEN,"ftruncat
28f60 65 22 2c 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  e",pShmNode->zFi
28f70 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
28f80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
28f90 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d  f( lock.l_type==
28fa0 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 72  F_WRLCK ){.    r
28fb0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
28fc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
28fd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28fe0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 2e 6c 5f   assert( lock.l_
28ff0 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 7c 7c  type==F_UNLCK ||
29000 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f   lock.l_type==F_
29010 52 44 4c 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  RDLCK );.    rc 
29020 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
29030 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c  ock(pDbFd, F_RDL
29040 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
29050 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
29060 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65  rn rc;.}..#if de
29070 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
29080 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
29090 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
290a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
290b0 72 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65  r *proxySharedMe
290c0 6d 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e 69  moryBasePath(uni
290d0 78 46 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66  xFile *);.#endif
290e0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73  ../*.** Open a s
290f0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
29100 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
29110 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  h open database 
29120 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a  file pDbFd.  .**
29130 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
29140 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
29150 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c  uses mmapped fil
29160 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  es..**.** The fi
29170 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  le used to imple
29180 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ment shared-memo
29190 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d  ry is in the sam
291a0 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61  e directory.** a
291b0 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  s the open datab
291c0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73  ase file and has
291d0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
291e0 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  s the open datab
291f0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68  ase.** file with
29200 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66   the "-shm" suff
29210 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65  ix added.  For e
29220 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64  xample, if the d
29230 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
29240 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f  is "/home/user1/
29250 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20  config.db" then 
29260 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73  the file that is
29270 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61   created and mma
29280 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72  pped.** for shar
29290 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ed memory will b
292a0 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f  e called "/home/
292b0 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d  user1/config.db-
292c0 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e  shm".  .**.** An
292d0 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74  other approach t
292e0 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65  o is to use file
292f0 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72  s in /dev/shm or
29300 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a   /dev/tmp or an.
29310 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d  ** some other tm
29320 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69  pfs mount. But i
29330 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69  f a file in a di
29340 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72  fferent director
29350 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61  y.** from the da
29360 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
29370 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72  sed, then differ
29380 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69  ing access permi
29390 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63  ssions.** or a c
293a0 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61  hroot() might ca
293b0 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e  use two differen
293c0 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74  t processes on t
293d0 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62  he same.** datab
293e0 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73  ase to end up us
293f0 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69  ing different fi
29400 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d  les for shared m
29410 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e  emory - .** mean
29420 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d  ing that their m
29430 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20  emory would not 
29440 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64  really be shared
29450 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20   - resulting.** 
29460 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  in database corr
29470 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68  uption.  Neverth
29480 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66  eless, this tmpf
29490 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20  s file usage.** 
294a0 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61  can be enabled a
294b0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75  t compile-time u
294c0 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48  sing -DSQLITE_SH
294d0 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65  M_DIRECTORY="/de
294e0 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65  v/shm".** or the
294f0 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68   equivalent.  Th
29500 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c  e use of the SQL
29510 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
29520 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a  Y compile-time.*
29530 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73  * option results
29540 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
29550 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c  ble build of SQL
29560 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20  ite;  builds of 
29570 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77  SQLite.** that w
29580 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51  ith differing SQ
29590 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
295a0 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65  RY settings atte
295b0 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  mpt to use the.*
295c0 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  * same database 
295d0 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
295e0 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20   time, database 
295f0 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
29600 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
29610 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d  . The SQLITE_SHM
29620 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69  _DIRECTORY compi
29630 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
29640 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20  s considered.** 
29650 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e  "unsupported" an
29660 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e  d may go away in
29670 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65   a future SQLite
29680 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20   release..**.** 
29690 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e  When opening a n
296a0 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ew shared-memory
296b0 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68   file, if no oth
296c0 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  er instances of 
296d0 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65  that.** file are
296e0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
296f0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
29700 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f   or in other pro
29710 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  cesses, then.** 
29720 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65  the file must be
29730 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
29740 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76  ro length or hav
29750 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65  e its header cle
29760 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ared..**.** If t
29770 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
29780 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64  base file (pDbFd
29790 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22  ) is using the "
297a0 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a  unix-excl" VFS.*
297b0 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  * that means tha
297c0 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
297d0 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
297e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
297f0 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20   and.** that no 
29800 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
29810 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64  are able to read
29820 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61   or write the da
29830 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74  tabase.  In.** t
29840 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20  hat case, we do 
29850 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20  not really need 
29860 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
29870 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  No shared memory
29880 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61  .** file is crea
29890 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64  ted.  The shared
298a0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
298b0 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68  simulated with h
298c0 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  eap memory..*/.s
298d0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
298e0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75  enSharedMemory(u
298f0 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  nixFile *pDbFd){
29900 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
29910 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20  m *p = 0;       
29920 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
29930 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65  tion to be opene
29940 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  d */.  struct un
29950 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
29960 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  ode;   /* The un
29970 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64  derlying mmapped
29980 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
29990 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
299a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
299b0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
299c0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
299d0 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  node;          /
299e0 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66  * The inode of f
299f0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68  d */.  char *zSh
29a00 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
29a10 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
29a20 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20  le used for SHM 
29a30 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c  */.  int nShmFil
29a40 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
29a50 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
29a60 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65  the SHM filename
29a70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
29a80 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
29a90 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  e for the new un
29aa0 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f  ixShm object. */
29ab0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
29ac0 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
29ad0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
29ae0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
29af0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
29b00 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
29b10 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65  eof(*p));.  asse
29b20 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
29b30 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
29b40 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e  k to see if a un
29b50 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
29b60 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
29b70 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   Reuse an existi
29b80 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70  ng.  ** one if p
29b90 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61  resent. Create a
29ba0 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
29bb0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e  ssary..  */.  un
29bc0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
29bd0 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64    pInode = pDbFd
29be0 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d  ->pInode;.  pShm
29bf0 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Node = pInode->p
29c00 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70  ShmNode;.  if( p
29c10 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
29c20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
29c30 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
29c40 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20       /* fstat() 
29c50 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73  info for databas
29c60 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65  e file */.#ifnde
29c70 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
29c80 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74  ECTORY.    const
29c90 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68   char *zBasePath
29ca0 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b   = pDbFd->zPath;
29cb0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
29cc0 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20  Call fstat() to 
29cd0 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70  figure out the p
29ce0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
29cf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29d00 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77   If.    ** a new
29d10 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63   *-shm file is c
29d20 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d  reated, an attem
29d30 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  pt will be made 
29d40 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20  to create it.   
29d50 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d   ** with the sam
29d60 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20  e permissions.. 
29d70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73     */.    if( os
29d80 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20  Fstat(pDbFd->h, 
29d90 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
29da0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
29db0 70 44 62 46 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  pDbFd, errno);. 
29dc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29dd0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
29de0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
29df0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69  n_err;.    }..#i
29e00 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
29e10 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
29e20 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
29e30 59 4c 45 20 5c 0a 20 20 20 20 20 20 26 26 20 21  YLE \.      && !
29e40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53  defined(SQLITE_S
29e50 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 0a 20 20  HM_DIRECTORY).  
29e60 20 20 2f 2a 20 49 66 20 70 44 62 46 64 20 69 73    /* If pDbFd is
29e70 20 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74 68   configured with
29e80 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
29e90 6f 64 65 2c 20 75 73 65 20 74 68 65 20 6c 6f 63  ode, use the loc
29ea0 61 6c 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  al .    ** lock 
29eb0 66 69 6c 65 20 70 61 74 68 20 74 6f 20 64 65 74  file path to det
29ec0 65 72 6d 69 6e 65 20 74 68 65 20 2d 73 68 6d 20  ermine the -shm 
29ed0 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 2a 2f  file path.    */
29ee0 0a 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79  .    if( isProxy
29ef0 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 44 62 46  LockingMode(pDbF
29f00 64 29 20 29 7b 0a 20 20 20 20 20 20 7a 42 61 73  d) ){.      zBas
29f10 65 50 61 74 68 20 3d 20 70 72 6f 78 79 53 68 61  ePath = proxySha
29f20 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74  redMemoryBasePat
29f30 68 28 70 44 62 46 64 29 3b 0a 20 20 20 20 20 20  h(pDbFd);.      
29f40 69 66 28 20 21 7a 42 61 73 65 50 61 74 68 20 29  if( !zBasePath )
29f50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
29f60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
29f70 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
29f80 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
29f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
29fa0 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 64 65 66  ndif.    .#ifdef
29fb0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
29fc0 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69  CTORY.    nShmFi
29fd0 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28  lename = sizeof(
29fe0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
29ff0 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73  TORY) + 31;.#els
2a000 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  e.    nShmFilena
2a010 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74  me = 6 + (int)st
2a020 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b  rlen(zBasePath);
2a030 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
2a040 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Node = sqlite3_m
2a050 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
2a060 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68  *pShmNode) + nSh
2a070 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20  mFilename );.   
2a080 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
2a090 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2a0a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2a0b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
2a0c0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
2a0d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d  .    memset(pShm
2a0e0 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Node, 0, sizeof(
2a0f0 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46  *pShmNode)+nShmF
2a100 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53  ilename);.    zS
2a110 68 6d 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  hm = pShmNode->z
2a120 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
2a130 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
2a140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
2a150 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
2a160 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2a170 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
2a180 53 68 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Shm, .          
2a190 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2a1a0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
2a1b0 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d  "/sqlite-shm-%x-
2a1c0 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %x",.           
2a1d0 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73            (u32)s
2a1e0 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33  Stat.st_ino, (u3
2a1f0 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b  2)sStat.st_dev);
2a200 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
2a210 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
2a220 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20  Filename, zShm, 
2a230 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50  "%s-shm", zBaseP
2a240 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
2a250 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
2a260 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 29  Fd->zPath, zShm)
2a270 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
2a280 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  mNode->h = -1;. 
2a290 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65     pDbFd->pInode
2a2a0 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
2a2b0 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  mNode;.    pShmN
2a2c0 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44  ode->pInode = pD
2a2d0 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  bFd->pInode;.   
2a2e0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2a2f0 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
2a300 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 53 68  tex ){.      pSh
2a310 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73  mNode->mutex = s
2a320 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
2a330 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
2a340 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28  FAST);.      if(
2a350 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
2a360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2a370 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2a380 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
2a390 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
2a3a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a3b0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
2a3c0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
2a3d0 20 29 7b 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   ){.#ifdef __APP
2a3e0 4c 45 5f 5f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  LE__.      /* On
2a3f0 20 4d 61 63 4f 53 20 61 6e 64 20 69 4f 53 2c 20   MacOS and iOS, 
2a400 61 76 6f 69 64 20 65 76 65 6e 20 74 72 79 69 6e  avoid even tryin
2a410 67 20 74 6f 20 6f 70 65 6e 20 61 20 72 65 61 64  g to open a read
2a420 2d 6f 6e 6c 79 20 53 48 4d 20 66 69 6c 65 0a 20  -only SHM file. 
2a430 20 20 20 20 20 2a 2a 20 66 6f 72 20 77 72 69 74       ** for writ
2a440 69 6e 67 2c 20 62 65 63 61 75 73 65 20 64 6f 69  ing, because doi
2a450 6e 67 20 73 6f 20 67 65 6e 65 72 61 74 65 73 20  ng so generates 
2a460 73 63 61 72 79 20 6c 6f 67 20 6d 65 73 73 61 67  scary log messag
2a470 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  es */.      if( 
2a480 6f 73 41 63 63 65 73 73 28 7a 53 68 6d 2c 20 52  osAccess(zShm, R
2a490 5f 4f 4b 7c 57 5f 4f 4b 29 21 3d 30 20 26 26 20  _OK|W_OK)!=0 && 
2a4a0 28 65 72 72 6e 6f 3d 3d 45 50 45 52 4d 20 7c 7c  (errno==EPERM ||
2a4b0 20 65 72 72 6e 6f 3d 3d 45 41 43 43 45 53 29 20   errno==EACCES) 
2a4c0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
2a4d0 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ode->h = -1;.   
2a4e0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2a4f0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
2a500 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2a510 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22  (pDbFd->zPath, "
2a520 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30  readonly_shm", 0
2a530 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  ) ){.        pSh
2a540 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
2a550 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52  t_open(zShm, O_R
2a560 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 28 73 53  DWR|O_CREAT, (sS
2a570 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  tat.st_mode&0777
2a580 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2a590 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
2a5a0 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  h<0 ){.        p
2a5b0 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
2a5c0 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f  ust_open(zShm, O
2a5d0 5f 52 44 4f 4e 4c 59 2c 20 28 73 53 74 61 74 2e  _RDONLY, (sStat.
2a5e0 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
2a5f0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d          if( pShm
2a600 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20  Node->h<0 ){.   
2a610 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2a620 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2a630 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
2a640 6f 70 65 6e 22 2c 20 7a 53 68 6d 29 3b 0a 20 20  open", zShm);.  
2a650 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
2a660 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
2a670 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 53 68     }.        pSh
2a680 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
2a690 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  y = 1;.      }..
2a6a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
2a6b0 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e   process is runn
2a6c0 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b  ing as root, mak
2a6d0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2a6e0 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  SHM file.      *
2a6f0 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68  * is owned by th
2a700 65 20 73 61 6d 65 20 75 73 65 72 20 74 68 61 74  e same user that
2a710 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e   owns the origin
2a720 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74  al database.  Ot
2a730 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
2a740 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  * the original o
2a750 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65  wner will not be
2a760 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74   able to connect
2a770 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2a780 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 70 53   robustFchown(pS
2a790 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74  hmNode->h, sStat
2a7a0 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73  .st_uid, sStat.s
2a7b0 74 5f 67 69 64 29 3b 0a 0a 20 20 20 20 20 20 72  t_gid);..      r
2a7c0 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72  c = unixLockShar
2a7d0 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20  edMemory(pDbFd, 
2a7e0 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 20  pShmNode);.     
2a7f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a800 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
2a810 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e  _READONLY_CANTIN
2a820 49 54 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  IT ) goto shm_op
2a830 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
2a840 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
2a850 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
2a860 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
2a870 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
2a880 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
2a890 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
2a8a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
2a8b0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
2a8c0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
2a8d0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
2a8e0 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
2a8f0 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
2a900 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
2a910 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
2a920 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
2a930 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
2a940 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
2a950 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
2a960 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
2a970 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
2a980 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
2a990 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
2a9a0 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
2a9b0 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
2a9c0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
2a9d0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
2a9e0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
2a9f0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
2aa00 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
2aa10 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
2aa20 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
2aa30 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
2aa40 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
2aa50 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
2aa60 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
2aa70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
2aa80 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
2aa90 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2aaa0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
2aab0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
2aac0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
2aad0 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
2aae0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
2aaf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2ab00 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
2ab10 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
2ab20 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20   rc;..  /* Jump 
2ab30 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
2ab40 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
2ab50 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67  r:.  unixShmPurg
2ab60 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20  e(pDbFd);       
2ab70 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
2ab80 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
2ab90 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
2aba0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
2abb0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2abc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2abd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2abe0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2abf0 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
2ac00 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
2ac10 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
2ac20 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
2ac30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2ac40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ac50 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
2ac60 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
2ac70 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
2ac80 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
2ac90 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
2aca0 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
2acb0 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
2acc0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
2acd0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2ace0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
2acf0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2ad00 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
2ad10 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
2ad20 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78  wise, if the bEx
2ad30 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  tend parameter i
2ad40 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
2ad50 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
2ad60 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
2ad70 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
2ad80 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
2ad90 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
2ada0 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
2adb0 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
2adc0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
2add0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
2ade0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2adf0 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78  rned. If .** bEx
2ae00 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  tend is non-zero
2ae10 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2ae20 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
2ae30 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
2ae40 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
2ae50 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
2ae60 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
2ae70 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2ae80 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
2ae90 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
2aea0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
2aeb0 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
2aec0 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
2aed0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
2aee0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
2aef0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
2af00 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
2af10 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
2af20 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
2af30 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
2af40 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
2af50 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
2af60 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
2af70 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
2af80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2af90 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  ixShmMap(.  sqli
2afa0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2afc0 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
2afd0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2afe0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
2b010 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
2b020 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
2b030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2b040 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
2b050 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c  /.  int bExtend,
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
2b080 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
2b090 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
2b0a0 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
2b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b0c0 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
2b0d0 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ry */.){.  unixF
2b0e0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
2b0f0 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
2b100 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78  ixShm *p;.  unix
2b110 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
2b120 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
2b130 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
2b140 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
2b150 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
2b160 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67  );.  int nReqReg
2b170 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ion;..  /* If th
2b180 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
2b190 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
2b1a0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
2b1b0 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
2b1c0 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
2b1d0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
2b1e0 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
2b1f0 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
2b200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b210 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2b220 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
2b230 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
2b240 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
2b250 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2b260 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
2b270 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70  >mutex);.  if( p
2b280 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63  ShmNode->isUnloc
2b290 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ked ){.    rc = 
2b2a0 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65  unixLockSharedMe
2b2b0 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53 68 6d  mory(pDbFd, pShm
2b2c0 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Node);.    if( r
2b2d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2b2e0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
2b2f0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69  .    pShmNode->i
2b300 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20  sUnlocked = 0;. 
2b310 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52   }.  assert( szR
2b320 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
2b330 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
2b340 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
2b350 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b360 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
2b370 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
2b380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
2b390 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
2b3a0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
2b3b0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
2b3c0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
2b3d0 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
2b3e0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
2b3f0 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
2b400 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65  /* Minimum numbe
2b410 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72 65 71  r of regions req
2b420 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61 70 70  uired to be mapp
2b430 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67  ed. */.  nReqReg
2b440 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b  ion = ((iRegion+
2b450 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53  nShmPerMap) / nS
2b460 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d  hmPerMap) * nShm
2b470 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70  PerMap;..  if( p
2b480 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
2b490 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20  <nReqRegion ){. 
2b4a0 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b     char **apNew;
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4c0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52        /* New apR
2b4d0 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
2b4e0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
2b4f0 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65   nReqRegion*szRe
2b500 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  gion;   /* Minim
2b510 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
2b520 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
2b530 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b550 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74  /* Used by fstat
2b560 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  () */..    pShmN
2b570 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
2b580 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69  szRegion;..    i
2b590 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
2b5a0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
2b5b0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
2b5c0 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
2b5d0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
2b5e0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
2b5f0 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65  ce..      ** Che
2b600 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
2b610 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
2b620 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
2b630 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
2b640 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65  s.      ** large
2b650 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
2b660 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
2b670 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20   region)..      
2b680 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  */.      if( osF
2b690 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  stat(pShmNode->h
2b6a0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2b6b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b6c0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a  _IOERR_SHMSIZE;.
2b6d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
2b6e0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
2b6f0 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73  }.  .      if( s
2b700 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79  Stat.st_size<nBy
2b710 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  te ){.        /*
2b720 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
2b730 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
2b740 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
2b750 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74  bExtend is set t
2b760 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c  o.        ** fal
2b770 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20  se, exit early. 
2b780 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20  *pp will be set 
2b790 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
2b7a0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
2b7b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2b7c0 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20     if( !bExtend 
2b7d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2b7e0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
2b7f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2b800 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
2b810 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69  ly, if bExtend i
2b820 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74  s true, extend t
2b830 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73  he file. Do this
2b840 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   by.        ** w
2b850 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
2b860 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20  byte to the end 
2b870 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70 61 67  of each (OS) pag
2b880 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  e being.        
2b890 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  ** allocated or 
2b8a0 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69  extended. Techni
2b8b0 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f  cally, we need o
2b8c0 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68 65  nly write to the
2b8d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74  .        ** last
2b8e0 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74   page in order t
2b8f0 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c  o extend the fil
2b900 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20 74  e. But writing t
2b910 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20  o all new.      
2b920 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65    ** pages force
2b930 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f  s the OS to allo
2b940 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69  cate them immedi
2b950 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64  ately, which red
2b960 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  uces.        ** 
2b970 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53  the chances of S
2b980 49 47 42 55 53 20 77 68 69 6c 65 20 61 63 63 65  IGBUS while acce
2b990 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64  ssing the mapped
2b9a0 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e   region later on
2b9b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2b9c0 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20       else{.     
2b9d0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
2b9e0 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39  t int pgsz = 409
2b9f0 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  6;.          int
2ba00 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20   iPg;..         
2ba10 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
2ba20 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61   last byte of ea
2ba30 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  ch newly allocat
2ba40 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70  ed or extended p
2ba50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  age */.         
2ba60 20 61 73 73 65 72 74 28 20 28 6e 42 79 74 65 20   assert( (nByte 
2ba70 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20  % pgsz)==0 );.  
2ba80 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
2ba90 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70  (sStat.st_size/p
2baa0 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65  gsz); iPg<(nByte
2bab0 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a  /pgsz); iPg++){.
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2bad0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  x = 0;.         
2bae0 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72     if( seekAndWr
2baf0 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  iteFd(pShmNode->
2bb00 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67  h, iPg*pgsz + pg
2bb10 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26 78 29  sz-1, "", 1, &x)
2bb20 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=1 ){.         
2bb30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2bb40 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64  *zFile = pShmNod
2bb50 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  e->zFilename;.  
2bb60 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2bb70 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2bb80 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
2bb90 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69  ZE, "write", zFi
2bba0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  le);.           
2bbb0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
2bbc0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  out;.           
2bbd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2bbe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2bbf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
2bc00 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
2bc10 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
2bc20 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
2bc30 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
2bc40 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
2bc50 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
2bc60 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
2bc70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
2bc80 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f  egion, nReqRegio
2bc90 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  n*sizeof(char *)
2bca0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
2bcb0 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
2bcc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2bcd0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2bce0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
2bcf0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2bd00 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
2bd10 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  on = apNew;.    
2bd20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
2bd30 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
2bd40 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ion ){.      int
2bd50 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e   nMap = szRegion
2bd60 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20  *nShmPerMap;.   
2bd70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2bd80 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20  void *pMem;.    
2bd90 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
2bda0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
2bdb0 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pMem = osMmap(0,
2bdc0 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20   nMap,.         
2bdd0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52     pShmNode->isR
2bde0 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52  eadonly ? PROT_R
2bdf0 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c  EAD : PROT_READ|
2be00 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20  PROT_WRITE, .   
2be10 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41           MAP_SHA
2be20 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  RED, pShmNode->h
2be30 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29  , szRegion*(i64)
2be40 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2be50 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
2be60 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d       if( pMem==M
2be70 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
2be80 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2be90 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2bea0 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d  IOERR_SHMMAP, "m
2beb0 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  map", pShmNode->
2bec0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2bed0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
2bee0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
2bef0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2bf00 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71         pMem = sq
2bf10 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
2bf20 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
2bf30 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b    if( pMem==0 ){
2bf40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2bf50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2bf60 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
2bf70 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
2bf80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bf90 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c   memset(pMem, 0,
2bfa0 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20   szRegion);.    
2bfb0 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
2bfc0 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70  =0; i<nShmPerMap
2bfd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2bfe0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
2bff0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
2c000 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61  gion+i] = &((cha
2c010 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f  r*)pMem)[szRegio
2c020 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n*i];.      }.  
2c030 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
2c040 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72  egion += nShmPer
2c050 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Map;.    }.  }..
2c060 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
2c070 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
2c080 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
2c090 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f      *pp = pShmNo
2c0a0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65  de->apRegion[iRe
2c0b0 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
2c0c0 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
2c0d0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
2c0e0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72  >isReadonly && r
2c0f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
2c100 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
2c110 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NLY;.  sqlite3_m
2c120 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
2c130 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
2c140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c150 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
2c160 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
2c170 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
2c180 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ment..**.** Note
2c190 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69   that the relati
2c1a0 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53  onship between S
2c1b0 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53  HAREd and EXCLUS
2c1c0 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c  IVE locks is a l
2c1d0 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65  ittle.** differe
2c1e0 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20  nt here than in 
2c1f0 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c  posix.  In xShmL
2c200 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67  ock(), one can g
2c210 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a  o from unlocked.
2c220 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64  ** to shared and
2c230 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e   back or from un
2c240 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73  locked to exclus
2c250 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42  ive and back.  B
2c260 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f  ut one may.** no
2c270 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64  t go from shared
2c280 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72   to exclusive or
2c290 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20   from exclusive 
2c2a0 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74  to shared..*/.st
2c2b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
2c2c0 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
2c2d0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
2c2e0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
2c2f0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
2c300 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
2c310 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
2c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c330 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
2c340 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
2c350 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c370 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
2c380 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
2c390 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
2c3a0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
2c3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
2c3c0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
2c3d0 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  e lock */.){.  u
2c3e0 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
2c3f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20   (unixFile*)fd; 
2c400 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2c410 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
2c420 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e  d memory */.  un
2c430 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
2c440 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
2c450 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
2c460 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
2c470 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ocked */.  unixS
2c480 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
2c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4a0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
2c4b0 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
2c4c0 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  s */.  unixShmNo
2c4d0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
2c4e0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20  ->pShmNode;  /* 
2c4f0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  The underlying f
2c500 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69  ile iNode */.  i
2c510 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c520 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2c530 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
2c540 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
2c550 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c570 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
2c580 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
2c590 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
2c5a0 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
2c5b0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
2c5c0 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
2c5d0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
2c5e0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
2c5f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  );.  assert( ofs
2c600 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
2c610 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
2c620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
2c630 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2c640 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
2c650 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
2c660 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
2c670 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
2c680 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
2c690 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
2c6a0 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
2c6b0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
2c6c0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
2c6d0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
2c6e0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
2c6f0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
2c700 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
2c710 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
2c720 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
2c730 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2c740 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
2c750 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c760 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
2c770 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
2c780 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
2c790 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2c7a0 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
2c7b0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
2c7c0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
2c7d0 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ..  mask = (1<<(
2c7e0 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
2c7f0 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fst);.  assert( 
2c800 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
2c810 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
2c820 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2c830 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
2c840 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
2c850 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
2c860 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
2c870 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
2c880 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
2c890 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
2c8a0 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
2c8b0 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
2c8c0 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
2c8d0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
2c8e0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
2c8f0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
2c900 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
2c910 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
2c920 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
2c930 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
2c940 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
2c950 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
2c960 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
2c970 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
2c980 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
2c990 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
2c9a0 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
2c9b0 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
2c9c0 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
2c9d0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
2c9e0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
2c9f0 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
2ca00 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
2ca10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2ca20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ca30 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
2ca40 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
2ca50 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
2ca60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ca70 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
2ca80 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
2ca90 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
2caa0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
2cab0 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
2cac0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
2cad0 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
2cae0 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
2caf0 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
2cb00 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
2cb10 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
2cb20 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
2cb30 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
2cb40 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
2cb50 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
2cb60 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
2cb70 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
2cb80 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
2cb90 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
2cba0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
2cbb0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
2cbc0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
2cbd0 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
2cbe0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
2cbf0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
2cc00 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
2cc10 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
2cc20 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
2cc30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2cc40 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
2cc50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2cc60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
2cc70 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
2cc80 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
2cc90 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
2cca0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
2ccb0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
2ccc0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
2ccd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cce0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
2ccf0 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
2cd00 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
2cd10 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
2cd20 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
2cd30 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_RDLCK, ofst+UN
2cd40 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
2cd50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2cd60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cd70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2cd80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
2cd90 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
2cda0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
2cdb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cdc0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
2cdd0 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
2cde0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2cdf0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
2ce00 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
2ce10 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
2ce20 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
2ce30 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
2ce40 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
2ce50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2ce60 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
2ce70 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
2ce80 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
2ce90 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
2cea0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
2ceb0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
2cec0 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
2ced0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
2cee0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
2cef0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
2cf00 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
2cf10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2cf20 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
2cf30 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2cf40 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
2cf50 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
2cf60 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
2cf70 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
2cf80 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
2cf90 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
2cfa0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
2cfb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cfc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
2cfd0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
2cfe0 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20  pDbFd, F_WRLCK, 
2cff0 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
2d000 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
2d010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d020 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2d030 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
2d040 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
2d050 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
2d060 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
2d070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2d080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2d090 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
2d0a0 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
2d0b0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
2d0c0 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
2d0d0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
2d0e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
2d0f0 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d   osGetpid(0), p-
2d100 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
2d110 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
2d120 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d130 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
2d140 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
2d150 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
2d160 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
2d170 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
2d180 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
2d190 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
2d1a0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
2d1b0 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
2d1c0 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
2d1d0 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
2d1e0 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
2d1f0 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
2d200 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
2d210 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
2d220 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2d230 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
2d240 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
2d250 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
2d260 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
2d270 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72  ;.  sqlite3Memor
2d280 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20  yBarrier();     
2d290 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d      /* compiler-
2d2a0 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62  defined memory b
2d2b0 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78  arrier */.  unix
2d2c0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20  EnterMutex();   
2d2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2d2e0 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72  lso mutex, for r
2d2f0 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75  edundancy */.  u
2d300 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2d310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
2d320 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
2d330 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
2d340 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
2d350 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
2d360 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
2d370 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
2d380 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
2d390 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
2d3a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2d3b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
2d3c0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2d3d0 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
2d3e0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
2d3f0 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
2d400 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2d410 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
2d420 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
2d430 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
2d440 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
2d450 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
2d460 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
2d470 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
2d480 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
2d490 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
2d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4b0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
2d4c0 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
2d4d0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
2d4e0 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
2d4f0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
2d500 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
2d510 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
2d520 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
2d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d540 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2d550 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
2d560 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
2d570 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
2d580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d590 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
2d5a0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2d5b0 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
2d5c0 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
2d5d0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
2d5e0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
2d5f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
2d600 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
2d610 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
2d620 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
2d630 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
2d640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2d650 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
2d660 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
2d670 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
2d680 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
2d690 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
2d6a0 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
2d6b0 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
2d6c0 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
2d6d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
2d6e0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
2d6f0 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
2d700 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
2d710 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
2d720 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
2d730 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
2d740 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
2d750 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
2d760 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
2d770 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
2d780 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
2d790 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
2d7a0 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
2d7b0 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
2d7c0 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
2d7d0 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
2d7e0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
2d7f0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
2d800 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
2d810 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2d820 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
2d830 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
2d840 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
2d850 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
2d860 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
2d870 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
2d880 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
2d890 30 20 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  0 ) {.      if (
2d8a0 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20 31 29  deleteFlag == 1)
2d8b0 20 7b 20 0a 20 20 20 20 20 20 20 20 6f 73 55 6e   { .        osUn
2d8c0 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  link(pShmNode->z
2d8d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2d8e0 20 7d 20 65 6c 73 65 20 69 66 20 28 64 65 6c 65   } else if (dele
2d8f0 74 65 46 6c 61 67 20 3d 3d 20 32 29 20 7b 0a 20  teFlag == 2) {. 
2d900 20 20 20 20 20 20 20 2f 2a 20 66 74 72 75 6e 63         /* ftrunc
2d910 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
2d920 20 33 32 20 2a 20 31 30 32 34 29 3b 20 2a 2f 0a   32 * 1024); */.
2d930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d940 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
2d950 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  DbFd);.  }.  uni
2d960 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
2d970 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d980 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  OK;.}...#else.# 
2d990 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61  define unixShmMa
2d9a0 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
2d9b0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20   unixShmLock    
2d9c0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
2d9d0 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
2d9e0 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61  fine unixShmUnma
2d9f0 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
2da00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2da10 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20  MIT_WAL */..#if 
2da20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
2da30 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
2da40 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2da50 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ).static const c
2da60 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c  har *unixTempFil
2da70 65 44 69 72 28 76 6f 69 64 29 3b 0a 0a 73 74 61  eDir(void);..sta
2da80 74 69 63 20 69 6e 74 20 75 6e 69 78 49 6e 76 61  tic int unixInva
2da90 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c  lidateSupportFil
2daa0 65 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  es(unixFile *pFi
2dab0 6c 65 2c 20 69 6e 74 20 73 6b 69 70 57 41 4c 29  le, int skipWAL)
2dac0 20 7b 0a 20 20 63 68 61 72 20 6a 50 61 74 68 5b   {.  char jPath[
2dad0 4d 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20  MAXPATHLEN+9];. 
2dae0 20 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74 72 6c   int zLen = strl
2daf0 63 70 79 28 6a 50 61 74 68 2c 20 70 46 69 6c 65  cpy(jPath, pFile
2db00 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ->zPath, MAXPATH
2db10 4c 45 4e 2b 39 29 3b 0a 20 20 69 66 28 20 7a 4c  LEN+9);.  if( zL
2db20 65 6e 3c 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b  en<MAXPATHLEN ){
2db30 0a 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c 65 6e  .    size_t jLen
2db40 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2db50 20 65 78 74 65 6e 73 69 6f 6e 73 5b 33 5d 5b 39   extensions[3][9
2db60 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20 22 2d  ] = { "-wal", "-
2db70 6a 6f 75 72 6e 61 6c 22 2c 20 22 2d 73 68 6d 22  journal", "-shm"
2db80 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   };.    int j = 
2db90 28 73 6b 69 70 57 41 4c 20 3f 20 31 20 3a 20 30  (skipWAL ? 1 : 0
2dba0 29 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20 6a 3c  );.    for( ; j<
2dbb0 33 3b 20 6a 2b 2b 20 29 7b 0a 20 20 20 20 20 20  3; j++ ){.      
2dbc0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
2dbd0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 68  to see if the sh
2dbe0 6d 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  m file is alread
2dbf0 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 74 68 69  y opened for thi
2dc00 73 20 70 46 69 6c 65 20 2a 2f 0a 20 20 20 20 20  s pFile */.     
2dc10 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20 20 20   if( j==2 ){.   
2dc20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75       unixEnterMu
2dc30 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
2dc40 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
2dc50 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
2dc60 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 20 20   threads */.    
2dc70 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20      unixShmNode 
2dc80 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c  *pShmNode = pFil
2dc90 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  e->pInode->pShmN
2dca0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ode;.        if(
2dcb0 20 70 53 68 6d 4e 6f 64 65 20 26 26 20 21 70 53   pShmNode && !pS
2dcc0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
2dcd0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
2dce0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
2dcf0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
2dd00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2dd10 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
2dd20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  );.          .  
2dd30 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d          if( pShm
2dd40 4e 6f 64 65 2d 3e 68 3e 3d 30 20 26 26 20 21 6f  Node->h>=0 && !o
2dd50 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
2dd60 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
2dd70 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
2dd80 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20 3d 20  ned long size = 
2dd90 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 34  (sStat.st_size<4
2dda0 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  ) ? sStat.st_siz
2ddb0 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20 20 20  e : 4;.         
2ddc0 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20 29 7b     if( size>0 ){
2ddd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
2dde0 7a 65 72 6f 28 70 53 68 6d 4e 6f 64 65 2d 3e 61  zero(pShmNode->a
2ddf0 70 52 65 67 69 6f 6e 5b 30 5d 2c 20 73 69 7a 65  pRegion[0], size
2de00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2de10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2de20 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
2de30 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
2de40 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2de50 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 20  tex();.         
2de60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2de70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2de80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2de90 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2dea0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
2deb0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  >mutex);.       
2dec0 20 7d 0a 20 20 20 20 20 20 20 20 75 6e 69 78 4c   }.        unixL
2ded0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
2dee0 20 20 20 7d 0a 20 20 20 20 20 20 6a 4c 65 6e 20     }.      jLen 
2def0 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61 74 68  = strlcpy(&jPath
2df00 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73 69 6f  [zLen], extensio
2df10 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20 20 20  ns[j], 9);.     
2df20 20 69 66 28 20 6a 4c 65 6e 20 3c 20 39 20 29 7b   if( jLen < 9 ){
2df30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66 6c  .        int jfl
2df40 61 67 73 20 3d 20 28 6a 3c 32 29 20 3f 20 4f 5f  ags = (j<2) ? O_
2df50 54 52 55 4e 43 20 3a 20 4f 5f 52 44 57 52 3b 0a  TRUNC : O_RDWR;.
2df60 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66 64 20          int jfd 
2df70 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20 6a 66  = open(jPath, jf
2df80 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
2df90 66 28 20 6a 66 64 3d 3d 28 2d 31 29 20 29 7b 0a  f( jfd==(-1) ){.
2dfa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
2dfb0 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno!=ENOENT ){. 
2dfc0 20 20 20 20 20 20 20 20 20 20 20 70 65 72 72 6f             perro
2dfd0 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  r(jPath);.      
2dfe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
2dff0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
2e000 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20 20 20   if( j==2 ){.   
2e010 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2e020 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20 20 20  stat sStat;.    
2e030 20 20 20 20 20 20 20 20 69 66 28 20 21 6f 73 46          if( !osF
2e040 73 74 61 74 28 6a 66 64 2c 20 26 73 53 74 61 74  stat(jfd, &sStat
2e050 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2e060 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
2e070 20 73 69 7a 65 20 3d 20 28 73 53 74 61 74 2e 73   size = (sStat.s
2e080 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53 74 61  t_size<4) ? sSta
2e090 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b 0a 20  t.st_size : 4;. 
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2e0b0 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20   size>0 ){.     
2e0c0 20 20 20 20 20 20 20 20 20 20 20 75 69 6e 74 33             uint3
2e0d0 32 5f 74 20 7a 65 72 6f 20 3d 20 30 3b 0a 20 20  2_t zero = 0;.  
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 77                pw
2e0f0 72 69 74 65 28 6a 66 64 2c 20 26 7a 65 72 6f 2c  rite(jfd, &zero,
2e100 20 28 73 69 7a 65 5f 74 29 73 69 7a 65 2c 20 30   (size_t)size, 0
2e110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2e120 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2e130 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e140 20 20 20 20 20 20 20 66 73 79 6e 63 28 6a 66 64         fsync(jfd
2e150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  );.          clo
2e160 73 65 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  se(jfd);.       
2e170 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2e180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2e190 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
2e1a0 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 73 61 66  ic int unixUnsaf
2e1b0 65 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73  eTruncateDatabas
2e1c0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
2e1d0 65 29 7b 0a 20 20 2f 2a 20 74 68 69 73 20 69 73  e){.  /* this is
2e1e0 20 6e 61 73 74 79 20 26 20 62 61 64 2e 20 20 64   nasty & bad.  d
2e1f0 65 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20  estruction with 
2e200 70 72 65 6a 75 64 69 63 65 2e 20 20 77 65 27 6c  prejudice.  we'l
2e210 6c 20 6c 6f 73 65 20 61 6c 6c 20 74 68 65 0a 20  l lose all the. 
2e220 20 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69   ** file locks i
2e230 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
2e240 68 6f 77 65 76 65 72 2e 20 73 71 6c 69 74 65 33  however. sqlite3
2e250 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 77 6f  _file_control wo
2e260 72 6b 73 20 70 72 6f 70 65 72 6c 79 2e 0a 20 20  rks properly..  
2e270 2a 2a 20 42 75 74 20 69 66 20 69 74 20 66 61 69  ** But if it fai
2e280 6c 73 2c 20 74 68 69 73 20 77 6f 72 6b 73 20 61  ls, this works a
2e290 70 70 72 6f 78 69 6d 61 74 65 6c 79 0a 20 20 2a  pproximately.  *
2e2a0 2f 0a 20 20 63 68 61 72 20 6a 6f 75 72 6e 61 6c  /.  char journal
2e2b0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
2e2c0 3b 0a 20 20 63 68 61 72 20 77 61 6c 50 61 74 68  ;.  char walPath
2e2d0 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
2e2e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2e2f0 4f 4b 3b 0a 20 20 0a 23 69 66 64 65 66 20 44 45  OK;.  .#ifdef DE
2e300 42 55 47 0a 20 20 66 70 72 69 6e 74 66 28 73 74  BUG.  fprintf(st
2e310 64 65 72 72 2c 20 22 46 6f 72 63 65 20 74 72 75  derr, "Force tru
2e320 6e 63 61 74 69 6e 67 20 64 61 74 61 62 61 73 65  ncating database
2e330 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a   %s\n", pFile->z
2e340 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Path);.#endif.  
2e350 73 74 72 6c 63 70 79 28 6a 6f 75 72 6e 61 6c 50  strlcpy(journalP
2e360 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ath, pFile->zPat
2e370 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
2e380 20 20 73 74 72 6c 63 61 74 28 6a 6f 75 72 6e 61    strlcat(journa
2e390 6c 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c  lPath, "-journal
2e3a0 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  ", MAXPATHLEN);.
2e3b0 20 20 73 74 72 6c 63 70 79 28 77 61 6c 50 61 74    strlcpy(walPat
2e3c0 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  h, pFile->zPath,
2e3d0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2e3e0 73 74 72 6c 63 61 74 28 77 61 6c 50 61 74 68 2c  strlcat(walPath,
2e3f0 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48   "-wal", MAXPATH
2e400 4c 45 4e 29 3b 0a 20 20 69 6e 74 20 66 64 31 20  LEN);.  int fd1 
2e410 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 69 6e  = pFile->h;.  in
2e420 74 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  t result = 0;.  
2e430 72 65 73 75 6c 74 20 3d 20 66 74 72 75 6e 63 61  result = ftrunca
2e440 74 65 28 66 64 31 2c 20 30 6c 6c 29 3b 0a 20 20  te(fd1, 0ll);.  
2e450 69 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 20 20  if (result) {.  
2e460 20 20 72 65 73 75 6c 74 20 3d 20 65 72 72 6e 6f    result = errno
2e470 3b 0a 20 20 7d 0a 20 20 69 66 20 28 72 65 73 75  ;.  }.  if (resu
2e480 6c 74 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53  lt) {.    rc = S
2e490 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
2e4a0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
2e4b0 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 29 3b 0a  pFile, result);.
2e4c0 20 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66 64 32    }.  .  int fd2
2e4d0 20 3d 20 6f 70 65 6e 28 6a 6f 75 72 6e 61 6c 50   = open(journalP
2e4e0 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20 20  ath, O_RDWR);.  
2e4f0 69 6e 74 20 72 65 73 75 6c 74 32 20 3d 20 30 3b  int result2 = 0;
2e500 0a 20 20 69 66 20 28 66 64 32 20 3c 20 30 29 20  .  if (fd2 < 0) 
2e510 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f 20  {.    if (errno 
2e520 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20 20  != ENOENT) {.   
2e530 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65 72 72     result2 = err
2e540 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  no;.    } else {
2e550 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d  .      result2 =
2e560 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c   0;.    }.  } el
2e570 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 32  se {.    result2
2e580 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64 32   = ftruncate(fd2
2e590 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28  , 0ll);.    if (
2e5a0 72 65 73 75 6c 74 32 29 20 7b 0a 20 20 20 20 20  result2) {.     
2e5b0 20 72 65 73 75 6c 74 32 20 3d 20 65 72 72 6e 6f   result2 = errno
2e5c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2e5d0 20 28 72 65 73 75 6c 74 32 20 26 26 20 21 72 65   (result2 && !re
2e5e0 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63 20 3d  sult) {.    rc =
2e5f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
2e600 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
2e610 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 32  o(pFile, result2
2e620 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74 20  );.  }.  .  int 
2e630 66 64 33 20 3d 20 6f 70 65 6e 28 77 61 6c 50 61  fd3 = open(walPa
2e640 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20 20 69  th, O_RDWR);.  i
2e650 6e 74 20 72 65 73 75 6c 74 33 20 3d 20 30 3b 0a  nt result3 = 0;.
2e660 20 20 69 66 20 28 66 64 33 20 3c 20 30 29 20 7b    if (fd3 < 0) {
2e670 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f 20 21  .    if (errno !
2e680 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20 20 20  = ENOENT) {.    
2e690 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72 72 6e    result3 = errn
2e6a0 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  o;.    } else {.
2e6b0 20 20 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20        result3 = 
2e6c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  0;.    }.  } els
2e6d0 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 33 20  e {.    result3 
2e6e0 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64 33 2c  = ftruncate(fd3,
2e6f0 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28 72   0ll);.    if (r
2e700 65 73 75 6c 74 33 29 20 7b 0a 20 20 20 20 20 20  esult3) {.      
2e710 72 65 73 75 6c 74 33 20 3d 20 65 72 72 6e 6f 3b  result3 = errno;
2e720 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20  .    }.  }.  if 
2e730 28 72 65 73 75 6c 74 33 20 26 26 20 21 28 72 65  (result3 && !(re
2e740 73 75 6c 74 20 7c 7c 20 72 65 73 75 6c 74 32 29  sult || result2)
2e750 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ) {.    rc = SQL
2e760 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73  ITE_IOERR;.    s
2e770 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
2e780 69 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b 0a 20  ile, result2);. 
2e790 20 7d 0a 20 20 0a 20 20 69 66 20 28 66 64 33 20   }.  .  if (fd3 
2e7a0 3e 3d 20 30 29 20 7b 0a 20 20 20 20 66 73 79 6e  >= 0) {.    fsyn
2e7b0 63 28 66 64 33 29 3b 0a 20 20 20 20 63 6c 6f 73  c(fd3);.    clos
2e7c0 65 28 66 64 33 29 3b 0a 20 20 7d 0a 20 20 69 66  e(fd3);.  }.  if
2e7d0 20 28 66 64 32 20 3e 3d 20 30 29 20 7b 0a 20 20   (fd2 >= 0) {.  
2e7e0 20 20 66 73 79 6e 63 28 66 64 32 29 3b 0a 20 20    fsync(fd2);.  
2e7f0 20 20 63 6c 6f 73 65 28 66 64 32 29 3b 0a 20 20    close(fd2);.  
2e800 7d 0a 20 20 66 73 79 6e 63 28 66 64 31 29 3b 0a  }.  fsync(fd1);.
2e810 09 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2e820 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
2e830 78 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73  xTruncateDatabas
2e840 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
2e850 65 2c 20 69 6e 74 20 62 46 6c 61 67 73 29 20 7b  e, int bFlags) {
2e860 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2e870 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  *id = (sqlite3_f
2e880 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
2e890 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e8a0 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b  K;.  void *pLock
2e8b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 66   = NULL;.  int f
2e8c0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lags = 0;.  int 
2e8d0 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 20  corruptFileLock 
2e8e0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 43 6f 72  = 0;.  int isCor
2e8f0 72 75 70 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rupt = 0;.  int 
2e900 66 6f 72 63 65 20 3d 20 28 62 46 6c 61 67 73 20  force = (bFlags 
2e910 26 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  & SQLITE_TRUNCAT
2e920 45 5f 46 4f 52 43 45 29 3b 0a 20 20 69 6e 74 20  E_FORCE);.  int 
2e930 73 61 66 65 46 61 69 6c 65 64 20 3d 20 30 3b 0a  safeFailed = 0;.
2e940 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2e950 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
2e960 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70 46  ON.  flags |= pF
2e970 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a  ile->protFlags;.
2e980 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
2e990 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2e9a0 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69 73 50  _STYLE.  if( isP
2e9b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  roxyLockingMode(
2e9c0 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 66 6c  pFile) ){.    fl
2e9d0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
2e9e0 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20  EN_AUTOPROXY;.  
2e9f0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63  }.#endif.  .  rc
2ea00 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
2ea10 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  uperlock(pFile->
2ea20 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73 2c  zPath, 0, flags,
2ea30 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a   0, 0, &pLock);.
2ea40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2ea50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
2ea60 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51  ORRUPT || rc==SQ
2ea70 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20  LITE_NOTADB ){. 
2ea80 20 20 20 20 20 69 73 43 6f 72 72 75 70 74 20 3d       isCorrupt =
2ea90 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   1;.      rc = s
2eaa0 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
2eab0 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c  lock_corrupt(id,
2eac0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43   SQLITE_LOCK_EXC
2ead0 4c 55 53 49 56 45 2c 0a 20 20 20 20 20 20 20 20  LUSIVE,.        
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb00 20 26 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63   &corruptFileLoc
2eb10 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  k);.    }.    if
2eb20 28 20 72 63 20 26 26 20 21 66 6f 72 63 65 20 29  ( rc && !force )
2eb30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2eb40 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
2eb50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
2eb60 49 67 6e 6f 72 65 20 74 68 65 20 6c 6f 63 6b 69  Ignore the locki
2eb70 6e 67 20 66 61 69 6c 75 72 65 20 69 66 20 66 6f  ng failure if fo
2eb80 72 63 65 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  rce is true */. 
2eb90 20 7d 0a 20 20 69 66 28 20 28 62 46 6c 61 67 73   }.  if( (bFlags
2eba0 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45  &SQLITE_TRUNCATE
2ebb0 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 48 45 41 44  _INITIALIZE_HEAD
2ebc0 45 52 5f 4d 41 53 4b 29 21 3d 30 20 29 7b 0a 20  ER_MASK)!=0 ){. 
2ebd0 20 20 20 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 65     /* initialize
2ebe0 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
2ebf0 69 6e 20 54 4d 50 44 49 52 20 61 6e 64 20 63 6f  in TMPDIR and co
2ec00 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
2ec10 6f 76 65 72 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  over */.    cons
2ec20 74 20 63 68 61 72 20 2a 74 44 69 72 20 3d 20 75  t char *tDir = u
2ec30 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
2ec40 3b 0a 20 20 20 20 69 6e 74 20 74 44 69 72 4c 65  ;.    int tDirLe
2ec50 6e 20 3d 20 73 74 72 6c 65 6e 28 74 44 69 72 29  n = strlen(tDir)
2ec60 3b 0a 20 20 20 20 69 6e 74 20 74 4c 65 6e 20 3d  ;.    int tLen =
2ec70 20 73 69 7a 65 6f 66 28 63 68 61 72 29 20 2a 20   sizeof(char) * 
2ec80 28 74 44 69 72 4c 65 6e 20 2b 20 31 32 29 3b 0a  (tDirLen + 12);.
2ec90 20 20 20 20 63 68 61 72 20 2a 74 44 62 50 61 74      char *tDbPat
2eca0 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  h = (char *)mall
2ecb0 6f 63 28 74 4c 65 6e 29 3b 0a 20 20 20 20 69 6e  oc(tLen);.    in
2ecc0 74 20 74 46 64 20 3d 20 2d 31 3b 0a 20 20 20 20  t tFd = -1;.    
2ecd0 0a 20 20 20 20 73 74 72 6c 63 70 79 28 74 44 62  .    strlcpy(tDb
2ece0 50 61 74 68 2c 20 74 44 69 72 2c 20 74 4c 65 6e  Path, tDir, tLen
2ecf0 29 3b 0a 20 20 20 20 69 66 28 20 74 44 62 50 61  );.    if( tDbPa
2ed00 74 68 5b 28 74 44 69 72 4c 65 6e 2d 31 29 5d 20  th[(tDirLen-1)] 
2ed10 21 3d 20 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  != '/' ){.      
2ed20 73 74 72 6c 63 61 74 28 74 44 62 50 61 74 68 2c  strlcat(tDbPath,
2ed30 20 22 2f 74 6d 70 64 62 58 58 58 58 58 22 2c 20   "/tmpdbXXXXX", 
2ed40 74 4c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73  tLen);.    } els
2ed50 65 20 7b 0a 20 20 20 20 20 20 73 74 72 6c 63 61  e {.      strlca
2ed60 74 28 74 44 62 50 61 74 68 2c 20 22 74 6d 70 64  t(tDbPath, "tmpd
2ed70 62 58 58 58 58 58 22 2c 20 74 4c 65 6e 29 3b 0a  bXXXXX", tLen);.
2ed80 20 20 20 20 7d 0a 20 20 20 20 74 46 64 20 3d 20      }.    tFd = 
2ed90 6d 6b 73 74 65 6d 70 28 74 44 62 50 61 74 68 29  mkstemp(tDbPath)
2eda0 3b 0a 20 20 20 20 69 66 28 20 74 46 64 3d 3d 2d  ;.    if( tFd==-
2edb0 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  1 ){.      store
2edc0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
2edd0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
2ede0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2edf0 3b 0a 20 20 20 20 20 20 73 61 66 65 46 61 69 6c  ;.      safeFail
2ee00 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
2ee10 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2ee20 20 2a 74 44 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *tDb = NULL;.  
2ee30 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61      copyfile_sta
2ee40 74 65 5f 74 20 73 3b 0a 20 20 20 20 20 20 69 6e  te_t s;.      in
2ee50 74 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  t trc = sqlite3_
2ee60 6f 70 65 6e 5f 76 32 28 74 44 62 50 61 74 68 2c  open_v2(tDbPath,
2ee70 20 26 74 44 62 2c 0a 20 20 20 20 20 20 20 20 20   &tDb,.         
2ee80 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
2ee90 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
2eea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2eeb0 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20  WRITE.          
2eec0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
2eed0 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
2eee0 4f 58 59 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  OXY), NULL);.   
2eef0 20 20 20 63 68 61 72 20 2a 65 72 72 6d 73 67 20     char *errmsg 
2ef00 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 63 6f  = NULL;.      co
2ef10 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 20 3d 20  nst char *sql = 
2ef20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 21 74  "";.      if( !t
2ef30 72 63 20 26 26 20 28 62 46 6c 61 67 73 26 53 51  rc && (bFlags&SQ
2ef40 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41  LITE_TRUNCATE_PA
2ef50 47 45 53 49 5a 45 5f 4d 41 53 4b 29 20 29 7b 0a  GESIZE_MASK) ){.
2ef60 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2ef70 61 72 20 70 61 67 65 73 69 7a 65 5f 73 71 6c 5b  ar pagesize_sql[
2ef80 34 5d 5b 32 32 5d 20 3d 20 7b 0a 20 20 20 20 20  4][22] = {.     
2ef90 20 20 20 20 20 22 70 72 61 67 6d 61 20 70 61 67       "pragma pag
2efa0 65 5f 73 69 7a 65 3d 31 30 32 34 22 2c 0a 20 20  e_size=1024",.  
2efb0 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20          "pragma 
2efc0 70 61 67 65 5f 73 69 7a 65 3d 32 30 34 38 22 2c  page_size=2048",
2efd0 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67  .          "prag
2efe0 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 34 30 39  ma page_size=409
2eff0 36 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70  6",.          "p
2f000 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d  ragma page_size=
2f010 38 31 39 32 22 20 0a 20 20 20 20 20 20 20 20 7d  8192" .        }
2f020 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50  ;.        int iP
2f030 61 67 65 73 69 7a 65 20 3d 20 28 28 28 62 46 6c  agesize = (((bFl
2f040 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43  ags&SQLITE_TRUNC
2f050 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53  ATE_PAGESIZE_MAS
2f060 4b 29 20 3e 3e 20 34 29 20 2d 20 31 29 3b 0a 20  K) >> 4) - 1);. 
2f070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2f080 50 61 67 65 73 69 7a 65 3e 3d 30 20 26 26 20 69  Pagesize>=0 && i
2f090 50 61 67 65 73 69 7a 65 3c 3d 34 20 29 3b 0a 20  Pagesize<=4 );. 
2f0a0 20 20 20 20 20 20 20 73 71 6c 20 3d 20 70 61 67         sql = pag
2f0b0 65 73 69 7a 65 5f 73 71 6c 5b 69 50 61 67 65 73  esize_sql[iPages
2f0c0 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 74 72  ize];.        tr
2f0d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2f0e0 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30 2c  (tDb, sql, 0, 0,
2f0f0 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20   &errmsg);.     
2f100 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 74 72   }.      if( !tr
2f110 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  c ){.        con
2f120 73 74 20 63 68 61 72 20 61 75 74 6f 76 61 63 75  st char autovacu
2f130 75 6d 5f 73 71 6c 5b 33 5d 5b 32 31 5d 20 3d 20  um_sql[3][21] = 
2f140 7b 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61  {.          "pra
2f150 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d  gma auto_vacuum=
2f160 30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70  0",.          "p
2f170 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75  ragma auto_vacuu
2f180 6d 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20  m=1",.          
2f190 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63  "pragma auto_vac
2f1a0 75 75 6d 3d 32 22 0a 20 20 20 20 20 20 20 20 7d  uum=2".        }
2f1b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41  ;.        int iA
2f1c0 75 74 6f 76 61 63 75 75 6d 20 3d 20 32 3b 20 2f  utovacuum = 2; /
2f1d0 2a 20 64 65 66 61 75 6c 74 20 74 6f 20 69 6e 63  * default to inc
2f1e0 72 65 6d 65 6e 74 61 6c 20 2a 2f 0a 20 20 20 20  remental */.    
2f1f0 20 20 20 20 69 66 28 20 28 62 46 6c 61 67 73 26      if( (bFlags&
2f200 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f  SQLITE_TRUNCATE_
2f210 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b 29  AUTOVACUUM_MASK)
2f220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 41   ){.          iA
2f230 75 74 6f 76 61 63 75 75 6d 20 3d 20 28 28 28 62  utovacuum = (((b
2f240 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55  Flags&SQLITE_TRU
2f250 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d  NCATE_AUTOVACUUM
2f260 5f 4d 41 53 4b 29 20 3e 3e 20 32 29 20 2d 20 31  _MASK) >> 2) - 1
2f270 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f280 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75       assert( iAu
2f290 74 6f 76 61 63 75 75 6d 3e 3d 30 20 26 26 20 69  tovacuum>=0 && i
2f2a0 41 75 74 6f 76 61 63 75 75 6d 3c 3d 32 20 29 3b  Autovacuum<=2 );
2f2b0 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20 61  .        sql = a
2f2c0 75 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b 69 41  utovacuum_sql[iA
2f2d0 75 74 6f 76 61 63 75 75 6d 5d 3b 0a 20 20 20 20  utovacuum];.    
2f2e0 20 20 20 20 74 72 63 20 3d 20 73 71 6c 69 74 65      trc = sqlite
2f2f0 33 5f 65 78 65 63 28 74 44 62 2c 20 73 71 6c 2c  3_exec(tDb, sql,
2f300 20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67 29 3b   0, 0, &errmsg);
2f310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f320 66 28 20 21 74 72 63 20 26 26 20 28 62 46 6c 61  f( !trc && (bFla
2f330 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  gs&SQLITE_TRUNCA
2f340 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  TE_JOURNALMODE_W
2f350 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AL) ){.        s
2f360 71 6c 20 3d 20 22 70 72 61 67 6d 61 20 6a 6f 75  ql = "pragma jou
2f370 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 3b 0a  rnal_mode=wal";.
2f380 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 73 71          trc = sq
2f390 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20  lite3_exec(tDb, 
2f3a0 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d  sql, 0, 0, &errm
2f3b0 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
2f3c0 20 20 20 69 66 28 20 74 72 63 20 29 7b 0a 20 20     if( trc ){.  
2f3d0 20 20 20 20 20 20 69 66 28 20 21 74 44 62 20 29        if( !tDb )
2f3e0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
2f3f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69  ntf(stderr, "fai
2f400 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 65 6d 70  led to open temp
2f410 20 64 61 74 61 62 61 73 65 20 27 25 73 27 20 74   database '%s' t
2f420 6f 20 72 65 73 65 74 20 22 0a 20 20 20 20 20 20  o reset ".      
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f440 20 20 20 20 22 74 72 75 6e 63 61 74 65 64 20 64      "truncated d
2f450 61 74 61 62 61 73 65 20 25 73 20 77 69 74 68 20  atabase %s with 
2f460 66 6c 61 67 73 20 25 78 3a 20 25 64 5c 6e 22 2c  flags %x: %d\n",
2f470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f480 20 20 20 20 20 20 20 20 20 20 20 20 74 44 62 50              tDbP
2f490 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ath, pFile->zPat
2f4a0 68 2c 20 62 46 6c 61 67 73 2c 20 74 72 63 29 3b  h, bFlags, trc);
2f4b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2f4c0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2f4d0 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65  f(stderr, "faile
2f4e0 64 20 74 6f 20 73 65 74 20 27 25 73 27 20 6f 6e  d to set '%s' on
2f4f0 20 74 72 75 6e 63 61 74 65 64 20 64 61 74 61 62   truncated datab
2f500 61 73 65 20 25 73 2c 20 25 64 3a 20 22 0a 20 20  ase %s, %d: ".  
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f520 20 20 20 20 20 20 20 20 22 25 73 5c 6e 22 2c 20          "%s\n", 
2f530 73 71 6c 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  sql, pFile->zPat
2f540 68 2c 20 74 72 63 2c 20 65 72 72 6d 73 67 29 3b  h, trc, errmsg);
2f550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f560 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 44 62   }.      if( tDb
2f570 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2f580 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  off = 0;.       
2f590 20 2f 2a 20 6d 65 72 67 65 20 74 68 65 20 77 61   /* merge the wa
2f5a0 6c 20 69 6e 74 6f 20 74 68 65 20 64 62 20 2a 2f  l into the db */
2f5b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f5c0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 74 44  _file_control(tD
2f5d0 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
2f5e0 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
2f5f0 4c 2c 20 26 6f 66 66 29 3b 0a 20 20 20 20 20 20  L, &off);.      
2f600 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
2f610 74 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tDb);.      }.  
2f620 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65      s = copyfile
2f630 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a  _state_alloc();.
2f640 20 20 20 20 20 20 6c 73 65 65 6b 28 74 46 64 2c        lseek(tFd,
2f650 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
2f660 20 20 20 20 20 6c 73 65 65 6b 28 70 46 69 6c 65       lseek(pFile
2f670 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  ->h, 0, SEEK_SET
2f680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6f  );.      if( fco
2f690 70 79 66 69 6c 65 28 74 46 64 2c 20 70 46 69 6c  pyfile(tFd, pFil
2f6a0 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c  e->h, s, COPYFIL
2f6b0 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20 20  E_DATA) ){.     
2f6c0 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
2f6d0 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
2f6e0 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20  (err) {.        
2f6f0 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20    case ENOMEM:. 
2f700 20 20 20 20 20 20 20 20 20 20 20 74 72 63 20 3d             trc =
2f710 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2f720 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2f730 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ;.          defa
2f740 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
2f750 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
2f760 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20  pFile, err);.   
2f770 20 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 53           trc = S
2f780 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
2f790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f7a0 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74       copyfile_st
2f7b0 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20 20  ate_free(s);.   
2f7c0 20 20 20 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e     fsync(pFile->
2f7d0 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28  h);.      close(
2f7e0 74 46 64 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69  tFd);.      unli
2f7f0 6e 6b 28 74 44 62 50 61 74 68 29 3b 0a 20 20 20  nk(tDbPath);.   
2f800 20 20 20 69 66 28 20 74 72 63 21 3d 53 51 4c 49     if( trc!=SQLI
2f810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f820 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b   safeFailed = 1;
2f830 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 74 72  .        rc = tr
2f840 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
2f850 0a 20 20 20 20 66 72 65 65 28 74 44 62 50 61 74  .    free(tDbPat
2f860 68 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  h);.  } else {. 
2f870 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70     rc = pFile->p
2f880 4d 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63 61 74  Method->xTruncat
2f890 65 28 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  e(id, .         
2f8a0 20 20 28 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61    ((pFile->fsFla
2f8b0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
2f8c0 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20 21 3d  AGS_IS_MSDOS) !=
2f8d0 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29 3b 0a   0) ? 1L : 0L);.
2f8e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2f8f0 20 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d      safeFailed =
2f900 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2f910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f920 4b 20 7c 7c 20 66 6f 72 63 65 20 29 7b 0a 20 20  K || force ){.  
2f930 20 20 72 63 20 3d 20 75 6e 69 78 49 6e 76 61 6c    rc = unixInval
2f940 69 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c 65  idateSupportFile
2f950 73 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  s(pFile, 0);.   
2f960 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2f970 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b   safeFailed = 1;
2f980 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 69  .    }.  }.  pFi
2f990 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 53 79  le->pMethod->xSy
2f9a0 6e 63 28 69 64 2c 20 53 51 4c 49 54 45 5f 53 59  nc(id, SQLITE_SY
2f9b0 4e 43 5f 46 55 4c 4c 29 3b 0a 0a 0a 20 20 69 66  NC_FULL);...  if
2f9c0 28 20 69 73 43 6f 72 72 75 70 74 20 29 7b 0a 20  ( isCorrupt ){. 
2f9d0 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
2f9e0 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75  uperunlock_corru
2f9f0 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74 46 69  pt(id, corruptFi
2fa00 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65  leLock);.  }else
2fa10 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20   if( pLock ){.  
2fa20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
2fa30 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29  perunlock(pLock)
2fa40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2fa50 73 73 65 72 74 28 66 6f 72 63 65 29 3b 0a 20 20  ssert(force);.  
2fa60 7d 0a 20 20 0a 20 20 69 66 28 20 66 6f 72 63 65  }.  .  if( force
2fa70 20 26 26 20 73 61 66 65 46 61 69 6c 65 64 29 7b   && safeFailed){
2fa80 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 55 6e  .    rc = unixUn
2fa90 73 61 66 65 54 72 75 6e 63 61 74 65 44 61 74 61  safeTruncateData
2faa0 62 61 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 7d  base(pFile);.  }
2fab0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
2fac0 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 63 6b 20  .}../*. ** Lock 
2fad0 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20 73 68  locations for sh
2fae0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b  ared-memory lock
2faf0 73 20 75 73 65 64 20 62 79 20 57 41 4c 20 6d 6f  s used by WAL mo
2fb00 64 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  de.. */.#ifndef 
2fb10 53 48 4d 5f 42 41 53 45 0a 23 20 64 65 66 69 6e  SHM_BASE.# defin
2fb20 65 20 53 48 4d 5f 42 41 53 45 20 20 20 20 20 20  e SHM_BASE      
2fb30 20 20 20 20 31 32 30 0a 23 20 64 65 66 69 6e 65      120.# define
2fb40 20 53 48 4d 5f 57 52 49 54 45 20 20 20 20 20 20   SHM_WRITE      
2fb50 20 20 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65     SHM_BASE.# de
2fb60 66 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b 50 4f  fine SHM_CHECKPO
2fb70 49 4e 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45  INT    (SHM_BASE
2fb80 2b 31 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d  +1).# define SHM
2fb90 5f 52 45 43 4f 56 45 52 20 20 20 20 20 20 20 28  _RECOVER       (
2fba0 53 48 4d 5f 42 41 53 45 2b 32 29 0a 23 20 64 65  SHM_BASE+2).# de
2fbb0 66 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f 46 49  fine SHM_READ_FI
2fbc0 52 53 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45  RST    (SHM_BASE
2fbd0 2b 33 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d  +3).# define SHM
2fbe0 5f 52 45 41 44 5f 53 49 5a 45 20 20 20 20 20 35  _READ_SIZE     5
2fbf0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 48 4d 5f 42  .#endif /* SHM_B
2fc00 41 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ASE */../*.** Th
2fc10 69 73 20 74 65 73 74 20 6f 6e 6c 79 20 77 6f 72  is test only wor
2fc20 6b 73 20 66 6f 72 20 6c 6f 63 6b 20 74 65 73 74  ks for lock test
2fc30 69 6e 67 20 6f 6e 20 75 6e 69 78 2f 70 6f 73 69  ing on unix/posi
2fc40 78 20 56 46 53 2e 0a 2a 2a 20 41 64 61 70 74 65  x VFS..** Adapte
2fc50 64 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65 74 6c  d from tool/getl
2fc60 6f 63 6b 2e 63 20 66 34 63 33 39 62 36 35 31 33  ock.c f4c39b6513
2fc70 37 30 31 35 36 63 61 65 39 37 39 35 30 31 61 37  70156cae979501a7
2fc80 62 31 35 36 62 64 62 61 35 30 65 37 63 65 0a 2a  b156bdba50e7ce.*
2fc90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2fca0 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28 75 6e  xLockstatePid(un
2fcb0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 70  ixFile *pFile, p
2fcc0 69 64 5f 74 20 70 69 64 2c 20 69 6e 74 20 2a 70  id_t pid, int *p
2fcd0 4c 6f 63 6b 73 74 61 74 65 29 7b 0a 20 20 69 6e  Lockstate){.  in
2fce0 74 20 68 44 62 3b 20 20 20 20 20 20 20 20 2f 2a  t hDb;        /*
2fcf0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2fd00 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 64 61   for the open da
2fd10 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2fd20 20 69 6e 74 20 68 53 68 6d 20 3d 20 2d 31 3b 20   int hShm = -1; 
2fd30 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2fd40 74 6f 72 20 66 6f 72 20 57 41 4c 20 73 68 61 72  tor for WAL shar
2fd50 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
2fd60 2f 0a 20 20 73 73 69 7a 65 5f 74 20 67 6f 74 3b  /.  ssize_t got;
2fd70 20 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65 61      /* Bytes rea
2fd80 64 20 66 72 6f 6d 20 68 65 61 64 65 72 20 2a 2f  d from header */
2fd90 0a 20 20 69 6e 74 20 69 73 57 61 6c 20 3d 20 30  .  int isWal = 0
2fda0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2fdb0 20 54 72 75 65 20 69 66 20 69 6e 20 57 41 4c 20   True if in WAL 
2fdc0 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  mode */.  int nL
2fdd0 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ock = 0;        
2fde0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fdf0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  f locks held */.
2fe00 20 20 69 6e 74 20 6e 6f 48 64 72 20 3d 20 30 3b    int noHdr = 0;
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe20 5a 65 72 6f 20 62 79 74 65 20 44 42 20 68 61 73  Zero byte DB has
2fe30 20 6e 6f 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   no header */.  
2fe40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48  unsigned char aH
2fe50 64 72 5b 31 30 30 5d 3b 20 20 20 2f 2a 20 44 61  dr[100];   /* Da
2fe60 74 61 62 61 73 65 20 68 65 61 64 65 72 20 2a 2f  tabase header */
2fe70 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70 4c 6f  .  .  assert(pLo
2fe80 63 6b 73 74 61 74 65 29 3b 0a 20 20 0a 20 20 2f  ckstate);.  .  /
2fe90 2a 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 61  * make sure we a
2fea0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2feb0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
2fec0 2a 2f 0a 20 20 68 44 62 20 3d 20 70 46 69 6c 65  */.  hDb = pFile
2fed0 2d 3e 68 3b 0a 20 20 69 66 28 20 68 44 62 3c 30  ->h;.  if( hDb<0
2fee0 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74   ){.    *pLockst
2fef0 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43  ate = SQLITE_LOC
2ff00 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20  KSTATE_ERROR;.  
2ff10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ff20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73  ERROR;.  }.  ass
2ff30 65 72 74 28 20 28 73 74 72 6c 65 6e 28 53 51 4c  ert( (strlen(SQL
2ff40 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 29  ITE_FILE_HEADER)
2ff50 2b 31 29 3d 3d 53 51 4c 49 54 45 5f 46 49 4c 45  +1)==SQLITE_FILE
2ff60 5f 48 45 41 44 45 52 5f 4c 45 4e 20 29 3b 0a 20  _HEADER_LEN );. 
2ff70 20 67 6f 74 20 3d 20 70 72 65 61 64 28 68 44 62   got = pread(hDb
2ff80 2c 20 61 48 64 72 2c 20 31 30 30 2c 20 30 29 3b  , aHdr, 100, 0);
2ff90 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
2ffa0 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20      *pLockstate 
2ffb0 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  = SQLITE_LOCKSTA
2ffc0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2ffd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2ffe0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74  R;.  }.  if( got
2fff0 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 48 64 72  ==0 ){.    noHdr
30000 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
30010 28 20 67 6f 74 21 3d 31 30 30 0a 20 20 20 20 20  ( got!=100.     
30020 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 48      || memcmp(aH
30030 64 72 2c 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f  dr, SQLITE_FILE_
30040 48 45 41 44 45 52 2c 20 53 51 4c 49 54 45 5f 46  HEADER, SQLITE_F
30050 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 29 21  ILE_HEADER_LEN)!
30060 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2a 70 4c 6f  =0.  ){.    *pLo
30070 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ckstate = SQLITE
30080 5f 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f 54 41 44  _LOCKSTATE_NOTAD
30090 42 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  B;.    return SQ
300a0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 7d  LITE_NOTADB;.  }
300b0 0a 20 20 0a 20 20 2f 2a 20 46 69 72 73 74 20 63  .  .  /* First c
300c0 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78 63 6c  heck for an excl
300d0 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
300e0 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73 4c  nLock += unixIsL
300f0 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c 20  ocked(pid, hDb, 
30100 46 5f 52 44 4c 43 4b 2c 20 53 48 41 52 45 44 5f  F_RDLCK, SHARED_
30110 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
30120 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ZE,.            
30130 20 20 20 20 20 20 20 20 20 20 20 20 22 45 58 43              "EXC
30140 4c 55 53 49 56 45 22 29 3b 0a 20 20 69 66 20 28  LUSIVE");.  if (
30150 21 6e 6f 48 64 72 29 20 7b 0a 20 20 20 20 69 73  !noHdr) {.    is
30160 57 61 6c 20 3d 20 61 48 64 72 5b 31 38 5d 3d 3d  Wal = aHdr[18]==
30170 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f  2;.  }.  if( nLo
30180 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c 3d 3d  ck==0 && isWal==
30190 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  0 ){.    /* Roll
301a0 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  back mode */.   
301b0 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73   nLock += unixIs
301c0 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c  Locked(pid, hDb,
301d0 20 46 5f 57 52 4c 43 4b 2c 20 50 45 4e 44 49 4e   F_WRLCK, PENDIN
301e0 47 5f 42 59 54 45 2c 20 53 48 41 52 45 44 5f 53  G_BYTE, SHARED_S
301f0 49 5a 45 2b 32 2c 0a 20 20 20 20 20 20 20 20 20  IZE+2,.         
30200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30210 20 22 50 45 4e 44 49 4e 47 7c 52 45 53 45 52 56   "PENDING|RESERV
30220 45 44 7c 53 48 41 52 45 44 22 29 3b 0a 20 20 7d  ED|SHARED");.  }
30230 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20  .  if( nLock==0 
30240 26 26 20 69 73 57 61 6c 21 3d 30 20 29 7b 0a 20  && isWal!=0 ){. 
30250 20 20 20 2f 2a 20 6c 6f 6f 6b 75 70 20 74 68 65     /* lookup the
30260 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
30270 20 66 6f 72 20 74 68 65 20 73 68 61 72 65 64 20   for the shared 
30280 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 66 20 77  memory file if w
30290 65 20 68 61 76 65 20 69 74 20 6f 70 65 6e 0a 20  e have it open. 
302a0 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72     ** in this pr
302b0 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69  ocess */.    uni
302c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
302d0 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
302e0 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
302f0 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
30300 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53 68 6d 4e   */.    unixShmN
30310 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
30320 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
30330 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 69 66 28  ShmNode;.    if(
30340 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20   pShmNode ){.   
30350 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
30360 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
30370 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 0a  >mutex);.      .
30380 20 20 20 20 20 20 68 53 68 6d 20 3d 20 70 53 68        hShm = pSh
30390 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20 20 20 20  mNode->h;.      
303a0 69 66 28 20 68 53 68 6d 20 3e 3d 20 30 29 7b 0a  if( hShm >= 0){.
303b0 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
303c0 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53  IsLocked(pid, hS
303d0 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d  hm, F_RDLCK, SHM
303e0 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57 41  _RECOVER, 1, "WA
303f0 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a  L-RECOVERY") ||.
30400 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 49             unixI
30410 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68  sLocked(pid, hSh
30420 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f  m, F_RDLCK, SHM_
30430 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57  WRITE, 1, "WAL-W
30440 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20  RITE") ){.      
30450 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20      nLock = 1;. 
30460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30470 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 73 71  .      .      sq
30480 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
30490 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
304a0 78 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 0a  x);.    } .    .
304b0 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30 20 29      if( hShm<0 )
304c0 7b 0a 20 20 20 20 20 20 2f 2a 20 74 68 65 20 73  {.      /* the s
304d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c  hared memory fil
304e0 65 20 69 73 6e 27 74 20 6f 70 65 6e 20 69 6e 20  e isn't open in 
304f0 74 68 69 73 20 70 72 6f 63 65 73 73 20 73 70 61  this process spa
30500 63 65 2c 20 6f 70 65 6e 20 6f 75 72 0a 20 20 20  ce, open our.   
30510 20 20 20 2a 2a 20 6f 77 6e 20 46 44 20 2a 2f 0a     ** own FD */.
30520 20 20 20 20 20 20 63 68 61 72 20 7a 53 68 6d 5b        char zShm[
30530 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20  MAXPATHLEN];.   
30540 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 41 4c     .      /* WAL
30550 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73   mode */.      s
30560 74 72 6c 63 70 79 28 7a 53 68 6d 2c 20 70 46 69  trlcpy(zShm, pFi
30570 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41  le->zPath, MAXPA
30580 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 73 74  THLEN);.      st
30590 72 6c 63 61 74 28 7a 53 68 6d 2c 20 22 2d 73 68  rlcat(zShm, "-sh
305a0 6d 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  m", MAXPATHLEN);
305b0 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20 6f 70  .      hShm = op
305c0 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f 4e 4c  en(zShm, O_RDONL
305d0 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  Y, 0);.      if(
305e0 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20   hShm<0 ){.     
305f0 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d     *pLockstate =
30600 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
30610 45 5f 4f 46 46 3b 0a 20 20 20 20 20 20 20 20 75  E_OFF;.        u
30620 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
30630 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
30650 20 7d 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69   }.      if( uni
30660 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
30670 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48  Shm, F_RDLCK, SH
30680 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57  M_RECOVER, 1, "W
30690 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c  AL-RECOVERY") ||
306a0 0a 20 20 20 20 20 20 20 20 20 75 6e 69 78 49 73  .         unixIs
306b0 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d  Locked(pid, hShm
306c0 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57  , F_RDLCK, SHM_W
306d0 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52  RITE, 1, "WAL-WR
306e0 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20 20  ITE") ){.       
306f0 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20   nLock = 1;.    
30700 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28    }.      close(
30710 68 53 68 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hShm);.    }.   
30720 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
30730 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f  );.  }.  if( nLo
30740 63 6b 3e 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f  ck>0 ){.    *pLo
30750 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ckstate = SQLITE
30760 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 3b 0a 20  _LOCKSTATE_ON;. 
30770 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2a 70   } else {.    *p
30780 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
30790 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46 46  TE_LOCKSTATE_OFF
307a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
307b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
307c0 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45  dif /* (SQLITE_E
307d0 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
307e0 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
307f0 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 23 69 66  APPLE__) */..#if
30800 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
30810 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  _SIZE>0./*.** If
30820 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
30830 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20   memory mapped, 
30840 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a  unmap file pFd..
30850 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
30860 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
30870 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61  xFile *pFd){.  a
30880 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
30890 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66  chOut==0 );.  if
308a0 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
308b0 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61  n ){.    osMunma
308c0 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  p(pFd->pMapRegio
308d0 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  n, pFd->mmapSize
308e0 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64  Actual);.    pFd
308f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
30900 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
30910 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64  ize = 0;.    pFd
30920 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
30930 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
30940 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
30950 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
30960 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
30970 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66   maintained by f
30980 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74  ile .** descript
30990 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62  or pFd to nNew b
309a0 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69  ytes. Any existi
309b0 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69  ng mapping is di
309c0 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  scarded..**.** I
309d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
309e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
309f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
30a00 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ariables:.**.** 
30a10 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70        unixFile.p
30a20 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20  MapRegion.**    
30a30 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70     unixFile.mmap
30a40 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e  Size.**       un
30a50 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41  ixFile.mmapSizeA
30a60 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75  ctual.**.** If u
30a70 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20  nsuccessful, an 
30a80 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
30a90 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69   logged via sqli
30aa0 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a  te3_log() and.**
30ab0 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69 61   the three varia
30ac0 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a  bles above are z
30ad0 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63  eroed. In this c
30ae0 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c  ase SQLite shoul
30af0 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63  d.** continue ac
30b00 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
30b10 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 78  base using the x
30b20 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74  Read() and xWrit
30b30 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a  e().** methods..
30b40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
30b50 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20  nixRemapfile(.  
30b60 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20  unixFile *pFd,  
30b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b80 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
30b90 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  or object */.  i
30ba0 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20  64 nNew         
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30bc0 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70 69  * Required mappi
30bd0 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  ng size */.){.  
30be0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
30bf0 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74   = "mmap";.  int
30c00 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20   h = pFd->h;    
30c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
30c30 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20  ptor open on db 
30c40 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f  file */.  u8 *pO
30c50 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d  rig = (u8 *)pFd-
30c60 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f  >pMapRegion;   /
30c70 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
30c80 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e  rent file mappin
30c90 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67  g */.  i64 nOrig
30ca0 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
30cb0 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53  Actual;     /* S
30cc0 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67  ize of pOrig reg
30cd0 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ion in bytes */.
30ce0 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20    u8 *pNew = 0; 
30cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
30d10 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e  on of new mappin
30d20 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  g */.  int flags
30d30 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20   = PROT_READ;   
30d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
30d50 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
30d60 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73  mmap() */..  ass
30d70 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
30d80 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Out==0 );.  asse
30d90 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d  rt( nNew>pFd->mm
30da0 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  apSize );.  asse
30db0 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d  rt( nNew<=pFd->m
30dc0 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20  mapSizeMax );.  
30dd0 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
30de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ;.  assert( pFd-
30df0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e  >mmapSizeActual>
30e00 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
30e10 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f  ;.  assert( MAP_
30e20 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69  FAILED!=0 );..#i
30e30 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50  fdef SQLITE_MMAP
30e40 5f 52 45 41 44 57 52 49 54 45 0a 20 20 69 66 28  _READWRITE.  if(
30e50 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73   (pFd->ctrlFlags
30e60 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e   & UNIXFILE_RDON
30e70 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c  LY)==0 ) flags |
30e80 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65  = PROT_WRITE;.#e
30e90 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69  ndif..  if( pOri
30ea0 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52  g ){.#if HAVE_MR
30eb0 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65  EMAP.    i64 nRe
30ec0 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  use = pFd->mmapS
30ed0 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63  ize;.#else.    c
30ee0 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61  onst int szSyspa
30ef0 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69  ge = osGetpagesi
30f00 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52  ze();.    i64 nR
30f10 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61  euse = (pFd->mma
30f20 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70  pSize & ~(szSysp
30f30 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  age-1));.#endif.
30f40 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26      u8 *pReq = &
30f50 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a  pOrig[nReuse];..
30f60 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79      /* Unmap any
30f70 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78   pages of the ex
30f80 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74  isting mapping t
30f90 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  hat cannot be re
30fa0 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  used. */.    if(
30fb0 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29   nReuse!=nOrig )
30fc0 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70  {.      osMunmap
30fd0 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65  (pReq, nOrig-nRe
30fe0 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  use);.    }..#if
30ff0 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
31000 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70   pNew = osMremap
31010 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20  (pOrig, nReuse, 
31020 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59  nNew, MREMAP_MAY
31030 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20  MOVE);.    zErr 
31040 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73  = "mremap";.#els
31050 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  e.    pNew = osM
31060 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e  map(pReq, nNew-n
31070 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41  Reuse, flags, MA
31080 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65  P_SHARED, h, nRe
31090 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  use);.    if( pN
310a0 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew!=MAP_FAILED )
310b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  {.      if( pNew
310c0 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20  !=pReq ){.      
310d0 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c    osMunmap(pNew,
310e0 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b   nNew - nReuse);
310f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
31100 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
31110 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
31120 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Orig;.      }.  
31130 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
31140 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74  /* The attempt t
31150 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69  o extend the exi
31160 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61  sting mapping fa
31170 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a  iled. Free it. *
31180 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  /.    if( pNew==
31190 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e  MAP_FAILED || pN
311a0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  ew==0 ){.      o
311b0 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e  sMunmap(pOrig, n
311c0 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Reuse);.    }.  
311d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20  }..  /* If pNew 
311e0 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74  is still NULL, t
311f0 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ry to create an 
31200 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70  entirely new map
31210 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ping. */.  if( p
31220 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  New==0 ){.    pN
31230 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e  ew = osMmap(0, n
31240 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  New, flags, MAP_
31250 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20  SHARED, h, 0);. 
31260 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   }..  if( pNew==
31270 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
31280 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
31290 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e  nNew = 0;.    un
312a0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
312b0 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d  E_OK, zErr, pFd-
312c0 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a  >zPath);..    /*
312d0 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61   If the mmap() a
312e0 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73  bove failed, ass
312f0 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ume that all sub
31300 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63  sequent mmap() c
31310 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  alls.    ** will
31320 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74   probably fail t
31330 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f  oo. Fall back to
31340 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
31350 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a  ite exclusively.
31360 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63      ** in this c
31370 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64  ase.  */.    pFd
31380 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
31390 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d  0;.  }.  pFd->pM
313a0 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64  apRegion = (void
313b0 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e   *)pNew;.  pFd->
313c0 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e  mmapSize = pFd->
313d0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
313e0 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nNew;.}../*.** 
313f0 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65  Memory map or re
31400 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65  map the file ope
31410 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63  ned by file-desc
31420 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74  riptor pFd (if t
31430 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c  he file.** is al
31440 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68  ready mapped, th
31450 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
31460 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  ng is replaced b
31470 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20  y the new). Or, 
31480 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72  if .** there alr
31490 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61  eady exists a ma
314a0 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66  pping for this f
314b0 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
314c0 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74  re still .** out
314d0 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28  standing xFetch(
314e0 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  ) references to 
314f0 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  it, this functio
31500 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
31510 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
31520 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65   nByte is non-ne
31530 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20  gative, then it 
31540 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  is the requested
31550 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65   size of .** the
31560 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61   mapping to crea
31570 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  te. Otherwise, i
31580 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20  f nByte is less 
31590 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
315a0 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
315b0 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69  d size is the si
315c0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
315d0 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75  n disk. The actu
315e0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  al size of the.*
315f0 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e  * created mappin
31600 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  g is either the 
31610 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
31620 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66  r the value conf
31630 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67  igured .** using
31640 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
31650 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65  AP_LIMIT, whiche
31660 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a  ver is smaller..
31670 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
31680 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
31690 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  o error occurs (
316a0 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70  even if the mapp
316b0 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65  ing is not.** re
316c0 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73  created as a res
316d0 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ult of outstandi
316e0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f  ng references) o
316f0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
31700 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
31710 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
31720 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
31730 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
31740 34 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72  4 nMap){.  asser
31750 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46  t( nMap>=0 || pF
31760 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
31770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  );.  assert( nMa
31780 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61  p>0 || (pFd->mma
31790 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d  pSize==0 && pFd-
317a0 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20  >pMapRegion==0) 
317b0 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  );.  if( pFd->nF
317c0 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
317d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
317e0 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
317f0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
31800 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
31810 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
31820 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
31830 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
31840 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62  t(pFd->h, &statb
31850 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  uf) ){.      ret
31860 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
31870 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
31880 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66    nMap = statbuf
31890 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20  .st_size;.  }.  
318a0 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
318b0 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
318c0 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
318d0 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20  pSizeMax;.  }.. 
318e0 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20   assert( nMap>0 
318f0 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  || (pFd->mmapSiz
31900 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61  e==0 && pFd->pMa
31910 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20  pRegion==0) );. 
31920 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
31930 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
31940 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46  unixRemapfile(pF
31950 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20  d, nMap);.  }.. 
31960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31970 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
31980 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
31990 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
319a0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
319b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
319c0 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
319d0 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
319e0 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
319f0 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
31a00 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
31a10 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
31a20 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
31a30 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
31a40 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
31a50 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
31a60 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
31a70 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
31a80 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
31a90 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
31aa0 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
31ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
31ac0 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
31ad0 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
31ae0 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
31af0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
31b00 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
31b10 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
31b20 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
31b30 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
31b40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
31b50 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
31b60 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
31b70 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20  must eventually 
31b80 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20  .** release the 
31b90 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c  reference by cal
31ba0 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68  ling unixUnfetch
31bb0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
31bc0 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69  t unixFetch(sqli
31bd0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
31be0 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
31bf0 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
31c00 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
31c10 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
31c20 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
31c30 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
31c40 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
31c50 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
31c60 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
31c70 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
31c80 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
31c90 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
31ca0 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
31cb0 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
31cc0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
31cd0 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69  t rc = unixMapfi
31ce0 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20  le(pFd, -1);.   
31cf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31d00 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
31d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31d20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
31d30 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
31d40 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
31d50 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
31d60 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
31d70 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
31d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
31d90 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
31da0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
31db0 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  If the third arg
31dc0 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  ument is non-NUL
31dd0 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
31de0 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61  ction releases a
31df0 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f   .** reference o
31e00 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61  btained by an ea
31e10 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e  rlier call to un
31e20 69 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  ixFetch(). The s
31e30 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
31e40 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
31e50 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
31e60 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
31e70 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
31e80 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
31e90 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
31ea0 68 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69  he unixFetch() i
31eb0 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  nvocation. .**.*
31ec0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69  * Or, if the thi
31ed0 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  rd argument is N
31ee0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
31ef0 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
31f00 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69   called .** to i
31f10 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
31f20 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
31f30 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
31f40 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
31f50 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ng .** may now b
31f60 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
31f70 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
31f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31f90 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69  unixUnfetch(sqli
31fa0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
31fb0 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29  4 iOff, void *p)
31fc0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
31fd0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
31fe0 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
31ff0 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
32000 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
32010 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
32020 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
32030 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20  AMETER(iOff);.. 
32040 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d   /* If p==0 (unm
32050 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ap the entire fi
32060 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d  le) then there m
32070 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61  ust be no outsta
32080 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74  nding .  ** xFet
32090 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
320a0 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
320b0 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
320c0 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
320d0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
320e0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
320f0 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
32100 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
32110 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
32120 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
32130 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
32140 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
32150 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
32160 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
32170 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
32180 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
32190 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29  f] );..  if( p )
321a0 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
321b0 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
321c0 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69  .    unixUnmapfi
321d0 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
321e0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
321f0 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c  tchOut>=0 );.#el
32200 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
32210 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
32220 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
32230 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32240 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64  ETER(iOff);.#end
32250 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
32260 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
32270 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
32280 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
32290 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
322a0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
322b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
322c0 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
322d0 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
322e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
322f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
32300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
32350 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
32360 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
32370 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
32380 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
32390 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
323a0 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
323b0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
323c0 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
323d0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
323e0 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
323f0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
32400 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
32410 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
32420 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
32430 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
32440 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
32450 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
32460 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
32470 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
32480 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
32490 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
324a0 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
324b0 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
324c0 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
324d0 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
324e0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
324f0 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
32500 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
32510 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
32520 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
32530 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
32540 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
32550 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
32560 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
32570 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
32580 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
32590 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
325a0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
325b0 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
325c0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
325d0 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
325e0 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
325f0 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  or finder-functi
32600 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
32610 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
32620 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
32630 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
32640 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
32650 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
32660 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
32670 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
32680 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
32690 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
326a0 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
326b0 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
326c0 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
326d0 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
326e0 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
326f0 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
32700 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
32710 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
32720 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
32730 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
32740 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
32750 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
32760 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
32770 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
32780 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
32790 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
327a0 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
327b0 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
327c0 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
327d0 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
327e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
327f0 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
32800 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
32810 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
32820 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
32830 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
32840 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
32850 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
32860 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
32870 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
32880 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
32890 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
328a0 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
328b0 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
328c0 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
328d0 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
328e0 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45  FINDER,METHOD,VE
328f0 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b  RSION,CLOSE,LOCK
32900 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53  ,UNLOCK,CKLOCK,S
32910 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61  HMMAP)     \.sta
32920 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
32930 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
32940 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32960 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56            \.   V
32970 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
32980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
32990 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
329a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c           \.   CL
329c0 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
329d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
329e0 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
329f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a00 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
32a10 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
32a20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
32a30 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
32a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a50 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
32a60 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
32a70 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
32a80 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
32a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32aa0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
32ab0 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
32ac0 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
32ad0 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
32ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32af0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
32b00 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
32b10 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
32b20 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
32b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b40 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
32b50 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
32b60 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
32b70 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
32b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b90 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
32ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32bb0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
32bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32be0 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
32bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c00 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
32c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c30 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
32c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c50 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
32c60 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
32c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c80 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
32c90 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
32ca0 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
32cb0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
32cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
32cd0 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
32ce0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
32cf0 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
32d00 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
32d20 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
32d30 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
32d40 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
32d50 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
32d60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
32d70 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20    SHMMAP,       
32d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32d90 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
32da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32db0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
32dc0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
32dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32de0 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
32df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e00 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
32e10 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
32e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32e30 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e50 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
32e60 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  nixShmUnmap,    
32e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
32e80 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
32e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ea0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
32eb0 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  ixFetch,        
32ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
32ed0 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ef0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
32f00 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20  xUnfetch,       
32f10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
32f20 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
32f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f40 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20         \.};     
32f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f90 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
32fa0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
32fb0 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
32fc0 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
32fd0 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70   *z, unixFile *p
32fe0 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f  ){   \.  UNUSED_
32ff0 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
33000 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
33010 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
33020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33030 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
33040 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
33050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33080 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20     \.}          
33090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330d0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
330e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
330f0 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
33100 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
33110 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20  ,unixFile *p)   
33120 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
33130 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
33140 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
33150 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
33160 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
33170 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
33180 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
33190 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
331a0 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
331b0 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
331c0 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
331d0 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
331e0 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
331f0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
33200 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
33210 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
33220 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
33230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
33240 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
33250 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
33260 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
33270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
33280 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64  hared memory and
33290 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65   mmap are enable
332a0 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
332b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
332c0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
332d0 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
332e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332f0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
33300 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b   */.  unixUnlock
33310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33320 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
33330 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
33340 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
33350 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
33360 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
33370 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  .  unixShmMap   
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33390 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
333a0 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
333b0 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c   nolockIoFinder,
333c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
333d0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
333e0 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  me */.  nolockIo
333f0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
33400 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
33410 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
33420 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20  ame */.  3,     
33430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33440 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
33450 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ory is enabled *
33460 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  /.  nolockClose,
33470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33480 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
33490 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  /.  nolockLock, 
334a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
334b0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
334c0 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  .  nolockUnlock,
334d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
334e0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
334f0 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  /.  nolockCheckR
33500 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a  eservedLock,  /*
33510 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
33520 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
33530 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
33540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
33550 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
33560 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f  .IOMETHODS(.  do
33570 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  tlockIoFinder,  
33580 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
33590 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
335a0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65  */.  dotlockIoMe
335b0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f  thods,         /
335c0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
335d0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
335e0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
335f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33600 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
33610 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
33620 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20    dotlockClose, 
33630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33640 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
33650 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20    dotlockLock,  
33660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33670 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
33680 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20   dotlockUnlock, 
33690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
336a0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
336b0 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65    dotlockCheckRe
336c0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78  servedLock, /* x
336d0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
336e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
336f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33700 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
33710 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ap method */.)..
33720 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
33730 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
33740 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
33750 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
33760 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
33770 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
33780 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
33790 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
337a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
337b0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
337c0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
337d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
337e0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
337f0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
33800 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
33810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
33820 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
33830 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
33840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
33850 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
33860 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
33870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
33880 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
33890 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
338a0 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43  vedLock,   /* xC
338b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
338c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
338d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338e0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
338f0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
33900 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
33910 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
33920 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
33930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
33940 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
33950 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
33960 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
33970 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
33980 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
33990 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
339a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339b0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
339c0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
339d0 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c   */.  semXClose,
339e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339f0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
33a00 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20   */.  semXLock, 
33a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
33a30 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c  */.  semXUnlock,
33a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33a50 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
33a60 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52   */.  semXCheckR
33a70 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
33a80 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
33a90 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
33aa0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
33ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33ac0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
33ad0 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
33ae0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
33af0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
33b00 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
33b10 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66  .IOMETHODS(.  af
33b20 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  pIoFinder,      
33b30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
33b40 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
33b50 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64  */.  afpIoMethod
33b60 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
33b70 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
33b80 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
33b90 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
33ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33bb0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
33bc0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
33bd0 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20    afpClose,     
33be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33bf0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
33c00 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20    afpLock,      
33c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33c20 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
33c30 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   afpUnlock,     
33c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
33c50 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
33c60 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76    afpCheckReserv
33c70 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78  edLock,     /* x
33c80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
33c90 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
33ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33cb0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
33cc0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
33cd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
33ce0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
33cf0 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
33d00 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
33d10 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
33d20 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
33d30 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
33d40 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
33d50 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
33d60 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
33d70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
33d80 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
33d90 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
33da0 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
33db0 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
33dc0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
33dd0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
33de0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
33df0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
33e00 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
33e10 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
33e20 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
33e30 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
33e40 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
33e50 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
33e60 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
33e70 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
33e80 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
33e90 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
33ea0 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
33eb0 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
33ec0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
33ed0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
33ee0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
33ef0 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
33f00 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
33f10 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
33f20 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
33f30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
33f40 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
33f50 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
33f60 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
33f70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
33f80 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
33f90 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
33fa0 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
33fb0 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
33fc0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
33fd0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
33fe0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
33ff0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
34000 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
34010 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
34020 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32  ject name */.  2
34030 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34040 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
34050 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61  ed memory is ena
34060 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43  bled */.  proxyC
34070 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
34080 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
34090 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c  thod */.  proxyL
340a0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
340b0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
340c0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e  hod */.  proxyUn
340d0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
340e0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
340f0 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43  thod */.  proxyC
34100 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
34110 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ,   /* xCheckRes
34120 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
34130 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
34140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34150 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
34160 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
34170 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
34180 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
34190 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
341a0 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
341b0 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
341c0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
341d0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
341e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
341f0 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
34200 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
34210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
34220 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
34230 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
34240 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
34250 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
34260 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
34270 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
34280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34290 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
342a0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
342b0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
342c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
342d0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
342e0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
342f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
34300 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
34310 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f  hod */.  nfsUnlo
34320 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
34330 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
34340 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
34350 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
34360 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ,     /* xCheckR
34370 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
34380 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
34390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343a0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
343b0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
343c0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
343d0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
343e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
343f0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
34400 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
34410 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
34420 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
34430 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
34440 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
34450 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34460 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
34470 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
34480 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
34490 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
344a0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
344b0 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
344c0 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
344d0 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
344e0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
344f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
34500 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
34510 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
34520 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
34530 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
34540 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
34550 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
34560 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
34570 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
34580 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
34590 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
345a0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
345b0 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
345c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
345d0 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
345e0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
345f0 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
34600 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
34610 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
34620 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
34630 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
34640 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
34650 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
34660 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
34670 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
34680 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
34690 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
346a0 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
346b0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
346c0 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
346d0 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
346e0 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
346f0 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
34700 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
34710 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
34720 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
34730 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
34740 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
34750 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
34760 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
34770 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
34780 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
34790 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
347a0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
347b0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
347c0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
347d0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
347e0 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
347f0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
34800 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
34810 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
34820 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
34830 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
34840 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
34850 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
34860 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
34870 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
34880 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
34890 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
348a0 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
348b0 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
348c0 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
348d0 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
348e0 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
348f0 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
34900 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
34910 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
34920 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
34930 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
34940 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
34950 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
34960 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
34970 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
34980 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
34990 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
349a0 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
349b0 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
349c0 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
349d0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
349e0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
349f0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
34a00 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
34a10 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
34a20 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
34a30 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
34a40 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
34a50 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
34a60 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
34a70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
34a80 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
34a90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
34aa0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
34ab0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
34ac0 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
34ad0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
34ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
34af0 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
34b00 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
34b10 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
34b20 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
34b30 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
34b40 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
34b50 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
34b60 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
34b70 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
34b80 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
34b90 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
34ba0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
34bb0 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
34bc0 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20  S_VXWORKS./*.** 
34bd0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
34be0 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72  nction for VxWor
34bf0 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ks checks to see
34c00 20 69 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f   if posix adviso
34c10 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f  ry.** locking wo
34c20 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  rks.  If it does
34c30 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 77  , then that is w
34c40 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 49 66  hat is used.  If
34c50 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20   it does not.** 
34c60 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62  work, then fallb
34c70 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d  ack to named sem
34c80 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a  aphore locking..
34c90 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
34ca0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
34cb0 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e  ds *vxworksIoFin
34cc0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
34cd0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
34ce0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
34cf0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34d00 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
34d10 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
34d20 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
34d30 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
34d40 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
34d50 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
34d60 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
34d70 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
34d80 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
34d90 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
34da0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
34db0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
34dc0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
34dd0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
34de0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
34df0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
34e00 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
34e10 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
34e20 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
34e30 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
34e40 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
34e50 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
34e60 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
34e70 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
34e80 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
34e90 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
34ea0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
34eb0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
34ec0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
34ed0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
34ee0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
34ef0 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
34f00 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
34f10 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
34f20 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
34f30 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
34f40 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
34f50 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
34f60 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
34f70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
34f80 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73  *(*const vxworks
34f90 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
34fa0 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
34fb0 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64   = vxworksIoFind
34fc0 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
34fd0 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
34fe0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
34ff0 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
35000 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20  ointer to an IO 
35010 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
35020 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
35030 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
35040 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
35050 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
35060 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
35070 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
35080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350c0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
350d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
350f0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
35100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35110 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
35120 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
35130 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
35140 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
35150 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
35160 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
35170 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
35180 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
35190 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
351a0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
351b0 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
351c0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
351d0 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
351e0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
351f0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
35200 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
35210 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
35220 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
35230 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
35240 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
35250 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
35260 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
35270 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
35280 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
35290 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
352a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
352b0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
352c0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
352d0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
352e0 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20   ctrlFlags      
352f0 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
35300 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20  more UNIXFILE_* 
35310 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63  values */.){.  c
35320 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
35330 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
35340 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
35350 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
35360 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
35370 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35380 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
35390 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
353a0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b  );..  /* No lock
353b0 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65  ing occurs in te
353c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
353d0 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
353e0 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c  name!=0 || (ctrl
353f0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
35400 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a  _NOLOCK)!=0 );..
35410 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
35420 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
35430 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  h, zFilename));.
35440 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
35450 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56   pNew->pVfs = pV
35460 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74  fs;.  pNew->zPat
35470 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
35480 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
35490 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73   = (u8)ctrlFlags
354a0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
354b0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
354c0 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  New->mmapSizeMax
354d0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
354e0 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23  Config.szMmap;.#
354f0 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
35500 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
35510 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ((ctrlFlags & UN
35520 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46  IXFILE_URI) ? zF
35530 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20  ilename : 0),.  
35540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35550 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c           "psow",
35560 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
35570 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
35580 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
35590 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
355a0 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  PSOW;.  }.  if( 
355b0 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  strcmp(pVfs->zNa
355c0 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d  me,"unix-excl")=
355d0 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
355e0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
355f0 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a  XFILE_EXCL;.  }.
35600 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
35610 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
35620 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
35630 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
35640 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
35650 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20  {.    ctrlFlags 
35660 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
35670 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  CK;.    rc = SQL
35680 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
35690 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
356a0 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ( ctrlFlags & UN
356b0 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b  IXFILE_NOLOCK ){
356c0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
356d0 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  le = &nolockIoMe
356e0 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
356f0 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
35700 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74  e = (**(finder_t
35710 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44  ype*)pVfs->pAppD
35720 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  ata)(zFilename, 
35730 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54  pNew);.#if SQLIT
35740 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
35750 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61  _STYLE.    /* Ca
35760 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e  che zFilename in
35770 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
35780 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f  text (AFP and do
35790 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20  tlock override) 
357a0 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79  for.    ** proxy
357b0 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20  Lock activation 
357c0 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d  is possible (rem
357d0 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73  ote proxy is bas
357e0 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20  ed on db name). 
357f0 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     ** zFilename 
35800 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
35810 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  til file is clos
35820 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a  ed, to support *
35830 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  /.    pNew->lock
35840 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f  ingContext = (vo
35850 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23  id*)zFilename;.#
35860 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
35870 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
35880 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  = &posixIoMethod
35890 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  s.#if defined(__
358a0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
358b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
358c0 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70  G_STYLE.    || p
358d0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
358e0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65  &nfsIoMethods.#e
358f0 6e 64 69 66 0a 20 20 20 20 20 2f 2a 20 73 75 70  ndif.     /* sup
35900 70 6f 72 74 20 57 41 4c 20 6d 6f 64 65 20 6f 6e  port WAL mode on
35910 20 72 65 61 64 20 6f 6e 6c 79 20 6d 6f 75 6e 74   read only mount
35920 65 64 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f  ed filesystem */
35930 0a 20 20 20 20 7c 7c 20 28 70 4c 6f 63 6b 69 6e  .    || (pLockin
35940 67 53 74 79 6c 65 20 3d 3d 20 26 6e 6f 6c 6f 63  gStyle == &noloc
35950 6b 49 6f 4d 65 74 68 6f 64 73 20 26 26 20 7a 46  kIoMethods && zF
35960 69 6c 65 6e 61 6d 65 21 3d 30 29 0a 20 20 29 7b  ilename!=0).  ){
35970 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
35980 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
35990 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
359a0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
359b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
359c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
359d0 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
359e0 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66 69  r occurred in fi
359f0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63  ndInodeInfo(), c
35a00 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
35a10 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a  scriptor.      *
35a20 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62  * immediately, b
35a30 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20  efore releasing 
35a40 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49  the mutex. findI
35a50 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66  nodeInfo() may f
35a60 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
35a70 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
35a80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
35a90 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
35aa0 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
35ab0 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
35ac0 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
35ad0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
35ae0 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
35af0 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
35b00 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
35b10 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
35b20 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
35b30 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
35b40 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
35b50 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
35b60 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
35b70 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
35b80 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
35b90 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
35ba0 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
35bb0 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
35bc0 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20  InodeInfo(). If 
35bd0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
35be0 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
35bf0 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
35c00 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
35c10 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
35c20 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
35c30 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
35c40 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
35c50 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
35c60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
35c70 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
35c80 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
35c90 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
35ca0 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
35cb0 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
35cc0 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
35cd0 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
35ce0 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
35cf0 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
35d00 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
35d10 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
35d20 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
35d30 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
35d40 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
35d50 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
35d60 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
35d70 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  E__);.      h = 
35d80 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  -1;.    }.    un
35d90 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
35da0 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
35db0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
35dc0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
35dd0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73  __APPLE__).  els
35de0 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
35df0 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  yle == &afpIoMet
35e00 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41  hods ){.    /* A
35e10 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  FP locking uses 
35e20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
35e30 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
35e40 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
35e50 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** the afpLockin
35e60 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  gContext..    */
35e70 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  .    afpLockingC
35e80 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
35e90 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
35ea0 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20  ontext = pCtx = 
35eb0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
35ec0 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20  ( sizeof(*pCtx) 
35ed0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d  );.    if( pCtx=
35ee0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
35ef0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
35f00 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
35f10 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c       /* NB: zFil
35f20 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64  ename exists and
35f30 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
35f40 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73  ntil the file is
35f50 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a   closed.      **
35f60 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65   according to re
35f70 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31  quirement F11141
35f80 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20  .  So we do not 
35f90 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20  need to make a. 
35fa0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
35fb0 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f  the filename. */
35fc0 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50  .      pCtx->dbP
35fd0 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
35fe0 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73  .      pCtx->res
35ff0 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  erved = 0;.     
36000 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20   srandomdev();. 
36010 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75       unixEnterMu
36020 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20  tex();.      rc 
36030 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
36040 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
36050 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
36060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36080 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b  _free(pNew->lock
36090 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
360a0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
360b0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
360c0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20  E__);.        h 
360d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
360e0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
360f0 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20  ex();        .  
36100 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
36110 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
36120 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74  ingStyle == &dot
36130 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
36140 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20  .    /* Dotfile 
36150 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
36160 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
36170 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
36180 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
36190 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  the dotlockLocki
361a0 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  ngContext .    *
361b0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63  /.    char *zLoc
361c0 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e  kFile;.    int n
361d0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73  Filename;.    as
361e0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21  sert( zFilename!
361f0 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  =0 );.    nFilen
36200 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
36210 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
36220 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
36230 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
36240 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65  3_malloc64(nFile
36250 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  name);.    if( z
36260 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  LockFile==0 ){. 
36270 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
36280 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
36290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
362a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
362b0 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
362c0 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
362d0 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
362e0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
362f0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
36300 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
36310 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
36320 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
36330 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
36340 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
36350 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
36360 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
36370 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
36380 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
36390 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
363a0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
363b0 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
363c0 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
363d0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
363e0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
363f0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
36400 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
36410 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
36420 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
36430 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
36440 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
36450 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
36460 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
36470 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
36480 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
36490 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
364a0 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
364b0 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
364c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364d0 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
364e0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
364f0 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
36500 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
36510 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
36520 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
36530 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
36540 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
36550 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
36560 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
36570 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
36580 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
36590 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
365a0 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
365b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
365c0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
365d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
365e0 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30  node->aSemName[0
365f0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
36600 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
36610 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
36620 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 74  }.#endif.  .  st
36630 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65  oreLastErrno(pNe
36640 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58  w, 0);.#if OS_VX
36650 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d  WORKS.  if( rc!=
36660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36670 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
36680 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
36690 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
366a0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55   h = -1;.    osU
366b0 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
366c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  ;.    pNew->ctrl
366d0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
366e0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65  E_DELETE;.  }.#e
366f0 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
36700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36710 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
36720 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
36730 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65   __LINE__);.  }e
36740 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  lse{.    pNew->p
36750 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e  Method = pLockin
36760 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e  gStyle;.    Open
36770 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20  Counter(+1);.   
36780 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e   verifyDbFile(pN
36790 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ew);.  }.  retur
367a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
367b0 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
367c0 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e  f a directory in
367d0 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65   which to put te
367e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
367f0 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
36800 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
36810 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65  directory can be
36820 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e   found, return N
36830 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
36840 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
36850 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
36860 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
36870 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
36880 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
36890 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
368a0 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
368b0 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
368c0 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20 20 7d 3b  ",.     ".".  };
368d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
368e0 69 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  i = 0;.  struct 
368f0 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73  stat buf;.  cons
36900 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 73  t char *zDir = s
36910 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
36920 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21 61  ctory;..  if( !a
36930 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72  zDirs[0] ) azDir
36940 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53  s[0] = getenv("S
36950 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a  QLITE_TMPDIR");.
36960 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
36970 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
36980 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
36990 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20  .  while(1){.   
369a0 20 69 66 28 20 7a 44 69 72 21 3d 30 0a 20 20 20   if( zDir!=0.   
369b0 20 20 26 26 20 6f 73 53 74 61 74 28 7a 44 69 72    && osStat(zDir
369c0 2c 20 26 62 75 66 29 3d 3d 30 0a 20 20 20 20 20  , &buf)==0.     
369d0 26 26 20 53 5f 49 53 44 49 52 28 62 75 66 2e 73  && S_ISDIR(buf.s
369e0 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 26 26 20  t_mode).     && 
369f0 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30  osAccess(zDir, 0
36a00 33 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  3)==0.    ){.   
36a10 20 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a     return zDir;.
36a20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
36a30 3d 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  =sizeof(azDirs)/
36a40 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
36a50 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a  ) ) break;.    z
36a60 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 2b 2b  Dir = azDirs[i++
36a70 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
36a80 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
36a90 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
36aa0 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
36ab0 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
36ac0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
36ad0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
36ae0 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
36af0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
36b00 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
36b10 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
36b20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
36b30 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
36b40 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
36b50 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 6f  har *zBuf){.  co
36b60 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a  nst char *zDir;.
36b70 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
36b80 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
36b90 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
36ba0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
36bb0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
36bc0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
36bd0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
36be0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
36bf0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
36c00 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
36c10 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
36c20 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a 42  ling. .  */.  zB
36c30 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 53 69 6d  uf[0] = 0;.  Sim
36c40 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
36c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
36c60 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75  R );..  zDir = u
36c70 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
36c80 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20  ;.  if( zDir==0 
36c90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
36ca0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
36cb0 48 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36 34  H;.  do{.    u64
36cc0 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   r;.    sqlite3_
36cd0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
36ce0 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 61  f(r), &r);.    a
36cf0 73 73 65 72 74 28 20 6e 42 75 66 3e 32 20 29 3b  ssert( nBuf>2 );
36d00 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d 32  .    zBuf[nBuf-2
36d10 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
36d20 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
36d30 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
36d40 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
36d50 45 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20 20  EFIX"%llx%c",.  
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d70 20 20 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b 0a     zDir, r, 0);.
36d80 20 20 20 20 69 66 28 20 7a 42 75 66 5b 6e 42 75      if( zBuf[nBu
36d90 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69 6d  f-2]!=0 || (iLim
36da0 69 74 2b 2b 29 3e 31 30 20 29 20 72 65 74 75 72  it++)>10 ) retur
36db0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
36dc0 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
36dd0 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
36de0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
36df0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
36e00 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
36e10 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
36e20 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
36e30 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
36e40 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
36e50 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
36e60 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
36e70 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
36e80 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
36e90 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
36ea0 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
36eb0 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
36ec0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
36ed0 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
36ee0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
36ef0 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
36f00 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
36f10 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
36f20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
36f30 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
36f40 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
36f50 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
36f60 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
36f70 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
36f80 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
36f90 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
36fa0 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
36fb0 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
36fc0 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
36fd0 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
36fe0 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
36ff0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
37000 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
37010 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
37020 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
37030 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37040 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
37050 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
37060 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
37070 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
37080 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
37090 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
370a0 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
370b0 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
370c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
370d0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
370e0 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
370f0 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
37100 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
37110 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
37120 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
37130 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
37140 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
37150 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
37160 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
37170 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
37180 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
37190 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
371a0 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
371b0 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
371c0 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
371d0 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
371e0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
371f0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
37200 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
37210 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
37220 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
37230 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
37240 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
37250 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
37260 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
37270 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
37280 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
37290 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
372a0 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
372b0 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
372c0 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
372d0 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
372e0 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
372f0 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
37300 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
37310 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
37320 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
37330 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
37340 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
37350 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
37360 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
37370 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
37380 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
37390 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
373a0 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
373b0 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
373c0 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
373d0 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
373e0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
373f0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
37400 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
37410 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
37420 2a 2f 0a 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  */..  unixEnterM
37430 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 41 20  utex();..  /* A 
37440 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
37450 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
37460 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
37470 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
37480 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
37490 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
374a0 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
374b0 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
374c0 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
374d0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
374e0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
374f0 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
37500 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
37510 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
37520 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
37530 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
37540 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
37550 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
37560 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
37570 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
37580 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
37590 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
375a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
375b0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
375c0 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
375d0 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
375e0 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
375f0 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
37600 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20   for a reusable 
37610 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
37620 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a  are not dire.  *
37630 2f 0a 20 20 69 66 28 20 6e 55 6e 75 73 65 64 46  /.  if( nUnusedF
37640 64 3e 30 20 26 26 20 30 3d 3d 6f 73 53 74 61 74  d>0 && 0==osStat
37650 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
37660 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
37670 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
37680 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
37690 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
376a0 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
376b0 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
376c0 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
376d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376e0 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
376f0 6c 65 49 64 2e 69 6e 6f 21 3d 28 75 36 34 29 73  leId.ino!=(u64)s
37700 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
37710 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20         pInode = 
37720 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
37730 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
37740 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69  ode ){.      Uni
37750 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a  xUnusedFd **pp;.
37760 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49        for(pp=&pI
37770 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  node->pUnused; *
37780 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
37790 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
377a0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
377b0 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
377c0 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
377d0 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
377e0 20 20 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a 20    nUnusedFd--;. 
377f0 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e         *pp = pUn
37800 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  used->pNext;.   
37810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
37820 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
37830 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20  );.#endif    /* 
37840 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a  if !OS_VXWORKS *
37850 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73  /.  return pUnus
37860 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  ed;.}../*.** Fin
37870 64 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64 20  d the mode, uid 
37880 61 6e 64 20 67 69 64 20 6f 66 20 66 69 6c 65 20  and gid of file 
37890 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73 74 61 74 69  zFile. .*/.stati
378a0 63 20 69 6e 74 20 67 65 74 46 69 6c 65 4d 6f 64  c int getFileMod
378b0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
378c0 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *zFile,         
378d0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d       /* File nam
378e0 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70  e */.  mode_t *p
378f0 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
37900 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
37910 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 7a 46  ermissions of zF
37920 69 6c 65 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a  ile */.  uid_t *
37930 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  pUid,           
37940 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
37950 20 75 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a   uid of zFile. *
37960 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20  /.  gid_t *pGid 
37970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37980 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20      /* OUT: gid 
37990 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 29 7b 0a  of zFile. */.){.
379a0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
379b0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
379c0 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73    /* Output of s
379d0 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73  tat() on databas
379e0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
379f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37a00 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
37a10 7a 46 69 6c 65 2c 20 26 73 53 74 61 74 29 20 29  zFile, &sStat) )
37a20 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73  {.    *pMode = s
37a30 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
37a40 37 37 37 3b 0a 20 20 20 20 2a 70 55 69 64 20 3d  777;.    *pUid =
37a50 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20   sStat.st_uid;. 
37a60 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74     *pGid = sStat
37a70 2e 73 74 5f 67 69 64 3b 0a 20 20 7d 65 6c 73 65  .st_gid;.  }else
37a80 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
37a90 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
37aa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
37ac0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
37ad0 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74   by unixOpen() t
37ae0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
37af0 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73  unix permissions
37b00 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65  .** to create ne
37b10 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66  w files with. If
37b20 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
37b30 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
37b40 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
37b50 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74  and a value suit
37b60 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67  able for passing
37b70 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
37b80 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32  gument to open(2
37b90 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ) is.** written 
37ba0 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e  to *pMode. If an
37bb0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
37bc0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
37bd0 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
37be0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
37bf0 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69  alue of *pMode i
37c00 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a  s not modified..
37c10 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61  **.** In most ca
37c20 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ses, this routin
37c30 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  e sets *pMode to
37c40 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62   0, which will b
37c50 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69  ecome.** an indi
37c60 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74  cation to robust
37c70 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74  _open() to creat
37c80 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67  e the file using
37c90 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  .** SQLITE_DEFAU
37ca0 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
37cb0 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79 20  ONS adjusted by 
37cc0 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75  the umask..** Bu
37cd0 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62 65  t if the file be
37ce0 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20  ing opened is a 
37cf0 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a  WAL or regular j
37d00 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
37d10 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  n .** this funct
37d20 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65 20  ion queries the 
37d30 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
37d40 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
37d50 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65  on the .** corre
37d60 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73  sponding databas
37d70 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20  e file and sets 
37d80 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76  *pMode to this v
37d90 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a  alue. Whenever .
37da0 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c  ** possible, WAL
37db0 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
37dc0 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 75  es are created u
37dd0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65  sing the same pe
37de0 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73  rmissions .** as
37df0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
37e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
37e10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49  *.** If the SQLI
37e20 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
37e30 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  MES option is en
37e40 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
37e50 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  ** original file
37e60 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61  name is unavaila
37e70 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41  ble.  But 8_3_NA
37e80 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  MES is only used
37e90 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65   for.** FAT file
37ea0 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d  systems and perm
37eb0 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d  issions do not m
37ec0 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20  atter there, so 
37ed0 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20  just use.** the 
37ee0 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  default permissi
37ef0 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
37f00 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c  nt findCreateFil
37f10 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
37f20 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
37f30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
37f40 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62   of file (possib
37f50 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65  ly) being create
37f60 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  d */.  int flags
37f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37f80 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
37f90 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72  passed as 4th ar
37fa0 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28  gument to xOpen(
37fb0 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70  ) */.  mode_t *p
37fc0 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
37fd0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
37fe0 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70  ermissions to op
37ff0 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  en file with */.
38000 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20    uid_t *pUid,  
38010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38020 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f    /* OUT: uid to
38030 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
38040 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69   */.  gid_t *pGi
38050 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
38060 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69        /* OUT: gi
38070 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
38080 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
38090 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
380a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
380b0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
380c0 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a   *pMode = 0;.  *
380d0 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69  pUid = 0;.  *pGi
380e0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61  d = 0;.  if( fla
380f0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
38100 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
38110 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
38120 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
38130 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
38140 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
38150 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
38160 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
38170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38180 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
38190 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
381a0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68  */..    /* zPath
381b0 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20   is a path to a 
381c0 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  WAL or journal f
381d0 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ile. The followi
381e0 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73  ng block derives
381f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68  .    ** the path
38200 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
38210 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
38220 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69   from zPath. Thi
38230 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a  s block handles.
38240 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
38250 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76  wing naming conv
38260 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a  entions:.    **.
38270 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
38280 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a  to db>-journal".
38290 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
382a0 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20  to db>-wal".    
382b0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
382c0 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20  b>-journalNN".  
382d0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
382e0 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20   db>-walNN".    
382f0 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20  **.    ** where 
38300 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20  NN is a decimal 
38310 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e  number. The NN n
38320 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72  aming schemes ar
38330 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62  e .    ** used b
38340 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69  y the test_multi
38350 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20  plex.c module.. 
38360 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20     */.    nDb = 
38370 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
38380 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20 20 20  zPath) - 1; .   
38390 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44   while( zPath[nD
383a0 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  b]!='-' ){.     
383b0 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 6f 70   /* In normal op
383c0 65 72 61 74 69 6f 6e 2c 20 74 68 65 20 6a 6f 75  eration, the jou
383d0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
383e0 69 6c 6c 20 61 6c 77 61 79 73 20 63 6f 6e 74 61  ill always conta
383f0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 27 2d  in.      ** a '-
38400 27 20 63 68 61 72 61 63 74 65 72 2e 20 20 48 6f  ' character.  Ho
38410 77 65 76 65 72 20 69 6e 20 38 2b 33 20 66 69 6c  wever in 8+3 fil
38420 65 6e 61 6d 65 20 6d 6f 64 65 2c 20 6f 72 20 69  ename mode, or i
38430 66 20 61 20 63 6f 72 72 75 70 74 0a 20 20 20 20  f a corrupt.    
38440 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
38450 75 72 6e 61 6c 20 73 70 65 63 69 66 69 65 73 20  urnal specifies 
38460 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
38470 20 77 69 74 68 20 61 20 67 6f 6f 66 79 20 6e 61   with a goofy na
38480 6d 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  me, then.      *
38490 2a 20 74 68 65 20 27 2d 27 20 6d 69 67 68 74 20  * the '-' might 
384a0 62 65 20 6d 69 73 73 69 6e 67 2e 20 2a 2f 0a 20  be missing. */. 
384b0 20 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20       if( nDb==0 
384c0 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d 27  || zPath[nDb]=='
384d0 2e 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  .' ) return SQLI
384e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6e 44 62  TE_OK;.      nDb
384f0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  --;.    }.    me
38500 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c  mcpy(zDb, zPath,
38510 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e   nDb);.    zDb[n
38520 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  Db] = '\0';..   
38530 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64   rc = getFileMod
38540 65 28 7a 44 62 2c 20 70 4d 6f 64 65 2c 20 70 55  e(zDb, pMode, pU
38550 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 7d 65 6c  id, pGid);.  }el
38560 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
38570 51 4c 49 54 45 5f 4f 50 45 4e 5f