/ Hex Artifact Content
Login

Artifact bddde71dc024574ace03ffee859abb99d152fd4a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2500: 45 5f 57 41 52 4e 45 44 20 20 20 20 30 78 30 31  E_WARNED    0x01
2510: 30 30 20 20 20 20 20 2f 2a 20 76 65 72 69 66 79  00     /* verify
2520: 44 62 46 69 6c 65 28 29 20 77 61 72 6e 69 6e 67  DbFile() warning
2530: 73 20 69 73 73 75 65 64 20 2a 2f 0a 23 64 65 66  s issued */.#def
2540: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f  ine UNIXFILE_BLO
2550: 43 4b 20 20 20 20 20 30 78 30 32 30 30 20 20 20  CK     0x0200   
2560: 20 20 2f 2a 20 4e 65 78 74 20 53 48 4d 20 6c 6f    /* Next SHM lo
2570: 63 6b 20 6d 69 67 68 74 20 62 6c 6f 63 6b 20 2a  ck might block *
2580: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  /../*.** Include
2590: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
25a0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
25b0: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
25c0: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
25d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
25e0: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
25f0: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
2600: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
2610: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
2620: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2630: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2640: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
2650: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
2660: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
2670: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2680: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2690: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
26a0: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
26b0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
26c0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
26d0: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
26e0: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
26f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
2700: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
2710: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
2720: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
2730: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
2740: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
2750: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
2760: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
2770: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
2780: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
2790: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
27a0: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
27b0: 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d  ./*.** HAVE_MREM
27c0: 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74  AP defaults to t
27d0: 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64  rue on Linux and
27e0: 20 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72   false everywher
27f0: 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  e else..*/.#if !
2800: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45  defined(HAVE_MRE
2810: 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65  MAP).# if define
2820: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
2830: 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55  defined(_GNU_SOU
2840: 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48  RCE).#  define H
2850: 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65  AVE_MREMAP 1.# e
2860: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41  lse.#  define HA
2870: 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e  VE_MREMAP 0.# en
2880: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  dif.#endif../*.*
2890: 2a 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c  * Explicitly cal
28a0: 6c 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72  l the 64-bit ver
28b0: 73 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20  sion of lseek() 
28c0: 6f 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65  on Android. Othe
28d0: 72 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a  rwise, lseek().*
28e0: 2a 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20  * is the 32-bit 
28f0: 76 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66  version, even if
2900: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
2910: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
2920: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e  ..*/.#ifdef __AN
2930: 44 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65  DROID__.# define
2940: 20 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23   lseek lseek64.#
2950: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
2960: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
2970: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
2980: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
2990: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
29a0: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
29b0: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
29c0: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
29d0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
29e0: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
29f0: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
2a00: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
2a10: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
2a20: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
2a30: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
2a40: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
2a50: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
2a60: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
2a70: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
2a80: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
2a90: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
2aa0: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
2ab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
2ac0: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
2ad0: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
2ae0: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
2af0: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
2b00: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
2b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
2b20: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
2b30: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
2b40: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
2b50: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
2b60: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
2b70: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
2b80: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
2b90: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
2ba0: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
2bb0: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
2bc0: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
2bd0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2be0: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
2bf0: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
2c00: 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  gid){.#if OS_VXW
2c10: 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b  ORKS.  return 0;
2c20: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
2c30: 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  geteuid() ? 0 : 
2c40: 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  fchown(fd,uid,gi
2c50: 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  d);.#endif.}../*
2c60: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
2c70: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
2c80: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
2c90: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
2ca0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
2cb0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
2cc0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
2cd0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2ce0: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2cf0: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2d00: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2d10: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2d20: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2d30: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2d40: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2d50: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2d60: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2d70: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2d80: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2d90: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2da0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2db0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2dc0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
2dd0: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
2de0: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
2df0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e10: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
2e20: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
2e30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
2e40: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
2e50: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
2e60: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
2e70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2e80: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
2e90: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
2ea0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
2eb0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
2ec0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
2ed0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
2ee0: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
2ef0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
2f00: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
2f10: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
2f20: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
2f30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
2f40: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
2f50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2f60: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
2f70: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
2f80: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
2f90: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
2fa0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
2fb0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
2fc0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2fd0: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
2fe0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
2ff0: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3000: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3010: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3020: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3030: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
3040: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3050: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
3060: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3070: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
3080: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
3090: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
30a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
30b0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
30c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
30d0: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
30e0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
30f0: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3100: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3110: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3120: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3130: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
3140: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
3150: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
3160: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
3170: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
3180: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
3190: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
31a0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
31b0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
31c0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
31d0: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
31e0: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
31f0: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3200: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
3210: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3220: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
3230: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
3240: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
3250: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3260: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3270: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3280: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
3290: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
32a0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
32b0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
32c0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
32d0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
32e0: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
32f0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3300: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3310: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3320: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
3330: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
3340: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3350: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
3360: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
3370: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
3380: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
3390: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
33a0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
33b0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
33c0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
33d0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
33e0: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
33f0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3400: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
3410: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3420: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
3430: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3440: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
3450: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3460: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
3470: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
3480: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
3490: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
34a0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
34b0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
34c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
34d0: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
34e0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
34f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3500: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
3510: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3520: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3530: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3540: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3550: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3560: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
3570: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3580: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
3590: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
35a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
35b0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
35c0: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
35d0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
35e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
35f0: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3600: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3610: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3620: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3630: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3640: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3650: 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73  osPread64   ((ss
3660: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
3670: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3680: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
3690: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
36a0: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
36b0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
36c0: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
36d0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
36e0: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
36f0: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3700: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3710: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3720: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3730: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3740: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3750: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3760: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
3770: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3780: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
3790: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
37a0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
37b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
37c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
37d0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
37e0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
37f0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3800: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3810: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3840: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3850: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3860: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3870: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3880: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3890: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
38a0: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
38b0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
38c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
38d0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
38e0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
38f0: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3900: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3910: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3920: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3930: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3940: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3950: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3960: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3970: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3980: 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  mod,     0  },.#
3990: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
39a0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
39b0: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
39c0: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
39d0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
39e0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
39f0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3a00: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3a10: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3a20: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3a30: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3a40: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3a50: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3a60: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3a70: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3a80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3a90: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3aa0: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3ab0: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3ac0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3ad0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ae0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3af0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3b00: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3b10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3b20: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3b30: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3b40: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3b50: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3b60: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3b70: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3b80: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3b90: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3ba0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3bb0: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3bc0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3bd0: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3be0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3bf0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3c00: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c10: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3c20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c30: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3c40: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3c50: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3c60: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3c70: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3c80: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3c90: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ca0: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3cb0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3cc0: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3cd0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ce0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3cf0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3d00: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3d10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3d20: 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20  r)posixFchown,  
3d30: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3d40: 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e  osFchown    ((in
3d50: 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67  t(*)(int,uid_t,g
3d60: 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  id_t))aSyscall[2
3d70: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3d80: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3d90: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
3da0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
3db0: 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22  IZE>0.  { "mmap"
3dc0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3dd0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61  _syscall_ptr)mma
3de0: 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  p,     0 },.#def
3df0: 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69  ine osMmap ((voi
3e00: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3e10: 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f  _t,int,int,int,o
3e20: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ff_t))aSyscall[2
3e30: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
3e40: 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20  { "munmap",     
3e50: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3e60: 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20  ll_ptr)munmap,  
3e70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3e80: 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28  fine osMunmap ((
3e90: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
3ea0: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3eb0: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
3ec0: 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
3ed0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
3ee0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ef0: 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20  all_ptr)mremap, 
3f00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3f10: 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22  lse.  { "mremap"
3f20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3f30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3f50: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3f60: 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f 69  e osMremap ((voi
3f70: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3f80: 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e  _t,size_t,int,..
3f90: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  .))aSyscall[23].
3fa0: 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20 22 67  pCurrent).  { "g
3fb0: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
3fc0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3fd0: 74 72 29 75 6e 69 78 47 65 74 70 61 67 65 73 69  tr)unixGetpagesi
3fe0: 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65  ze, 0 },.#define
3ff0: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
4000: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
4010: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
4020: 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 6c  ent)..  { "readl
4030: 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74  ink",     (sqlit
4040: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72  e3_syscall_ptr)r
4050: 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  eadlink,        
4060: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52  0 },.#define osR
4070: 65 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f  eadlink ((ssize_
4080: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
4090: 2c 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  ,char*,size_t))a
40a0: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
40b0: 72 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d  rent)..#endif..}
40c0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
40d0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
40e0: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
40f0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
4100: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
4110: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
4120: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
4130: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
4140: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
4150: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
4160: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
4170: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
4180: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
4190: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
41a0: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
41b0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
41c0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
41d0: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
41e0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
41f0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
4200: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4210: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
4220: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
4230: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
4240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4260: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
4270: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
4280: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
4290: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
42a0: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
42b0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
42c0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
42d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
42e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
42f0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
4300: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4310: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
4320: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
4330: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
4340: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
4350: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
4360: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
4370: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
4380: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
4390: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
43a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
43b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
43c0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
43d0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
43e0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
43f0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
4400: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
4410: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4420: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
4430: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4440: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4450: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4460: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
4470: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
4480: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
4490: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
44a0: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
44b0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
44c0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
44d0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
44e0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
44f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4500: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4510: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
4520: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4530: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
4540: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
4550: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4560: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
4570: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
4580: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
4590: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
45a0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
45b0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
45c0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
45d0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
45e0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
45f0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
4600: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4620: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4630: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4640: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
4650: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
4660: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
4670: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
4680: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
4690: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
46a0: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
46b0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
46c0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
46d0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
46e0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
46f0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
4700: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
4710: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
4720: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
4730: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4740: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4750: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
4760: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
4770: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
4780: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4790: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
47a0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
47b0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
47c0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
47d0: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
47e0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
47f0: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
4800: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
4810: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
4820: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
4830: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
4840: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
4850: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
4860: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
4870: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
4880: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4890: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
48a0: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
48b0: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
48c0: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
48d0: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
48e0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
48f0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
4900: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
4910: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
4920: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
4930: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
4940: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
4950: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
4960: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
4970: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4980: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
4990: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
49a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
49b0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
49c0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
49d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
49e0: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
49f0: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
4a00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
4a10: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4a20: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
4a30: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4a40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  ;.}../*.** Do no
4a60: 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c  t accept any fil
4a70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73  e descriptor les
4a80: 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
4a90: 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  e, in order to a
4aa0: 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  void.** opening 
4ab0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
4ac0: 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70  ing file descrip
4ad0: 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f  tors that are co
4ae0: 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  mmonly used for 
4af0: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
4b00: 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20  ut, output, and 
4b10: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  error..*/.#ifnde
4b20: 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  f SQLITE_MINIMUM
4b30: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
4b40: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
4b50: 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45  _MINIMUM_FILE_DE
4b60: 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69  SCRIPTOR 3.#endi
4b70: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  f../*.** Invoke 
4b80: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
4b90: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
4ba0: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
4bb0: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
4bc0: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
4bd0: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
4be0: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
4bf0: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
4c00: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
4c10: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
4c20: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
4c30: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
4c40: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
4c50: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
4c60: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
4c70: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
4c80: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
4c90: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
4ca0: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
4cb0: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
4cc0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
4cd0: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
4ce0: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
4cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
4d00: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
4d10: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
4d20: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
4d30: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
4d40: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
4d50: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
4d60: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
4d70: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
4d80: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
4d90: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
4da0: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
4db0: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
4dc0: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
4dd0: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
4de0: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
4df0: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
4e00: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
4e10: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
4e20: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
4e30: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
4e40: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
4e50: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
4e60: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
4e70: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
4e80: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
4e90: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
4ea0: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
4eb0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
4ec0: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
4ed0: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
4ee0: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
4ef0: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
4f00: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
4f10: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
4f20: 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65  ISSIONS;.  while
4f30: 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  (1){.#if defined
4f40: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
4f50: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
4f60: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
4f70: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
4f80: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
4f90: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c  ndif.    if( fd<
4fa0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
4fb0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f  rrno==EINTR ) co
4fc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72  ntinue;.      br
4fd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
4fe0: 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49  f( fd>=SQLITE_MI
4ff0: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
5000: 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20  IPTOR ) break;. 
5010: 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a     osClose(fd);.
5020: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5030: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
5040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5050: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65   "attempt to ope
5060: 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65  n \"%s\" as file
5070: 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c   descriptor %d",
5080: 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20   z, fd);.    fd 
5090: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73  = -1;.    if( os
50a0: 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  Open("/dev/null"
50b0: 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61  , f, m)<0 ) brea
50c0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e  k;.  }.  if( fd>
50d0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
50e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
50f0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
5100: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
5110: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
5120: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
5130: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
5140: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
5150: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
5160: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
5170: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
5180: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
5190: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
51a0: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
51b0: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
51c0: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
51d0: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
51e0: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
51f0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
5200: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
5210: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5220: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5230: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
5240: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
5250: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
5260: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
5270: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
5280: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
5290: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
52a0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
52b0: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
52c0: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
52d0: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
52e0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
52f0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
5300: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
5310: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5320: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5330: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5340: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5350: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5360: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5370: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5380: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
5390: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
53a0: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
53b0: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
53c0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
53d0: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
53e0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
53f0: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
5400: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
5410: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5420: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5430: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5440: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5450: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5460: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5470: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
5480: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
5490: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
54a0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
54b0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
54c0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
54d0: 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69  TIC_VFS1));.}.#i
54e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
54f0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
5500: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
5510: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
5520: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
5530: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5540: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5550: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
5560: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
5570: 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
5580: 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  ACE./*.** Helper
5590: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
55a0: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
55b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
55c0: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
55d0: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
55e0: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
55f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5600: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
5610: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
5620: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
5630: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
5640: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
5650: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
5660: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5670: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
5680: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
5690: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
56a0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
56b0: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
56c0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
56d0: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
56e0: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
56f0: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
5700: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
5710: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
5720: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
5730: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
5740: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
5750: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
5760: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5770: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
5780: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
5790: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
57a0: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
57b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
57c0: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
57d0: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
57e0: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
57f0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
5800: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
5810: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
5820: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5830: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
5840: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
5850: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
5860: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
5870: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
5880: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
5890: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
58a0: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
58b0: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
58c0: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
58d0: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
58e0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
58f0: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
5900: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
5910: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
5920: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
5930: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
5940: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
5950: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
5960: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
5970: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
5980: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
5990: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
59a0: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
59b0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
59c0: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
59d0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
59e0: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
59f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
5a00: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
5a10: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
5a20: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
5a30: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
5a40: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
5a50: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
5a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
5a70: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
5a80: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
5a90: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
5aa0: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
5ab0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
5ac0: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
5ad0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5ae0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
5af0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
5b00: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
5b10: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
5b20: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
5b30: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
5b40: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
5b50: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
5b60: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
5b70: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
5b80: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
5b90: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
5ba0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
5bb0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
5bc0: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
5bd0: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
5be0: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
5bf0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
5c00: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
5c10: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
5c20: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
5c30: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5c40: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
5c50: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
5c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5c70: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
5c80: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5c90: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
5ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
5cb0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
5cc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
5cd0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
5ce0: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
5cf0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
5d00: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
5d10: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
5d20: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
5d30: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
5d40: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
5d50: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
5d60: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
5d70: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
5d80: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
5d90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
5da0: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
5db0: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
5dc0: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
5dd0: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
5de0: 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c  TR.**.** All cal
5df0: 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28  ls to ftruncate(
5e00: 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 69  ) within this fi
5e10: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  le should be mad
5e20: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69  e through.** thi
5e30: 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74  s wrapper.  On t
5e40: 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66  he Android platf
5e50: 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74  orm, bypassing t
5e60: 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a  he logic below.*
5e70: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
5e80: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
5e90: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
5ea0: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
5eb0: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
5ec0: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
5ed0: 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f  nt rc;.#ifdef __
5ee0: 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f  ANDROID__.  /* O
5ef0: 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e  n Android, ftrun
5f00: 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75 73  cate() always us
5f10: 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74  es 32-bit offset
5f20: 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a  s, even if .  **
5f30: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
5f40: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
5f50: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20  . This means it 
5f60: 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74  is unsafe to att
5f70: 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75  empt to.  ** tru
5f80: 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
5f90: 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20  any size larger 
5fa0: 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e  than 2GiB. Silen
5fb0: 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20  tly ignore any. 
5fc0: 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74   ** such attempt
5fd0: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e  s.  */.  if( sz>
5fe0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30  (sqlite3_int64)0
5ff0: 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20  x7FFFFFFF ){.   
6000: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6010: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
6020: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
6030: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
6040: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
6050: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
6060: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6070: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6080: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
6090: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
60a0: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
60b0: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
60c0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
60d0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
60e0: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
60f0: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
6100: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
6110: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
6120: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
6130: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
6140: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
6150: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
6160: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
6170: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
6180: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
6190: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
61a0: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
61b0: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
61c0: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
61d0: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
61e0: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
61f0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
6200: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
6210: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
6220: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
6230: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
6240: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
6250: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
6260: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
6270: 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70  r) {.  switch (p
6280: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66  osixError) {.#if
6290: 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70   0.  /* At one p
62a0: 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77  oint this code w
62b0: 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64  as not commented
62c0: 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c   out. In theory,
62d0: 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
62e0: 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  * should never b
62f0: 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66  e hit, as this f
6300: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
6310: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
6320: 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69  ter.  ** a locki
6330: 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ng-related funct
6340: 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28  ion (i.e. fcntl(
6350: 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20  )) has returned 
6360: 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20  non-zero with.  
6370: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
6380: 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72  errno as the fir
6390: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e  st argument. Sin
63a0: 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  ce a system call
63b0: 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a   has failed,.  *
63c0: 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62  * errno should b
63d0: 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a  e non-zero..  **
63e0: 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68  .  ** Despite th
63f0: 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61  is, if errno rea
6400: 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20  lly is zero, we 
6410: 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74  still don't want
6420: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
6430: 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73  SQLITE_OK. The s
6440: 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65  ystem call faile
6450: 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51  d, and *some* SQ
6460: 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c  Lite error shoul
6470: 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67  d be.  ** propag
6480: 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ated back to the
6490: 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74   caller. Comment
64a0: 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20  ing this branch 
64b0: 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d  out means errno=
64c0: 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  =0.  ** will be 
64d0: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22  handled by the "
64e0: 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62  default:" case b
64f0: 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  elow..  */.  cas
6500: 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  e 0: .    return
6510: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
6520: 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49  if..  case EAGAI
6530: 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44  N:.  case ETIMED
6540: 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53  OUT:.  case EBUS
6550: 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a  Y:.  case EINTR:
6560: 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20  .  case ENOLCK: 
6570: 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20   .    /* random 
6580: 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c  NFS retry error,
6590: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
65a0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
65b0: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
65c0: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
65d0: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
65e0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
65f0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
6600: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
6610: 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a   .  case EACCES:
6620: 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20   .    /* EACCES 
6630: 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64  is like EAGAIN d
6640: 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70  uring locking op
6650: 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f  erations, but no
6660: 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65  t any other time
6670: 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  */.    if( (sqli
6680: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
6690: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c  E_IOERR_LOCK) ||
66a0: 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74   .        (sqlit
66b0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
66c0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
66d0: 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  | .        (sqli
66e0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
66f0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20  E_IOERR_RDLOCK) 
6700: 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  ||.        (sqli
6710: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
6720: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
6730: 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20  ERVEDLOCK) ){.  
6740: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6750: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
6760: 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74    /* else fall t
6770: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65  hrough */.  case
6780: 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74   EPERM: .    ret
6790: 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
67a0: 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54  .    .#if EOPNOT
67b0: 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20  SUPP!=ENOTSUP.  
67c0: 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a  case EOPNOTSUPP:
67d0: 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69   .    /* somethi
67e0: 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79  ng went terribly
67f0: 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75   awry, unless du
6800: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
6810: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
6820: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
6830: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
6840: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
6850: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
6860: 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50  f.#ifdef ENOTSUP
6870: 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a  .  case ENOTSUP:
6880: 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64   .    /* invalid
6890: 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69   fd, unless duri
68a0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
68b0: 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63  upport introspec
68c0: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a  tion, in which .
68d0: 20 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c       * it actual
68e0: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
68f0: 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a   says */.#endif.
6900: 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61    case EIO:.  ca
6910: 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65  se EBADF:.  case
6920: 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20   EINVAL:.  case 
6930: 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65  ENOTCONN:.  case
6940: 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20   ENODEV:.  case 
6950: 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e  ENXIO:.  case EN
6960: 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45 53 54  OENT:.#ifdef EST
6970: 41 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ALE             
6980: 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54 41 4c          /* ESTAL
6990: 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  E is not defined
69a0: 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79 73 74   on Interix syst
69b0: 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20 45 53  ems */.  case ES
69c0: 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63  TALE:.#endif.  c
69d0: 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20  ase ENOSYS:.    
69e0: 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20  /* these should 
69f0: 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74  force the client
6a00: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69   to close the fi
6a10: 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74  le and reconnect
6a20: 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75   */.    .  defau
6a30: 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  lt: .    return 
6a40: 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d  sqliteIOErr;.  }
6a50: 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
6ab0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e  ******* Begin Un
6ac0: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
6ad0: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
6ae0: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
6af0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f  ****.**.** On mo
6b00: 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75  st versions of u
6b10: 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20  nix, we can get 
6b20: 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20  a unique ID for 
6b30: 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74  a file by concat
6b40: 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64  enating.** the d
6b50: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64  evice number and
6b60: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
6b70: 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65  r.  But this doe
6b80: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
6b90: 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57  Works..** On VxW
6ba0: 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66  orks, a unique f
6bb0: 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62  ile id must be b
6bc0: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f  ased on the cano
6bd0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  nical filename..
6be0: 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
6bf0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
6c00: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6c10: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
6c20: 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e   used as a.** un
6c30: 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20  ique file ID in 
6c40: 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69  VxWorks.  Each i
6c50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
6c60: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
6c70: 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20  ns.** a copy of 
6c80: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
6c90: 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69  lename.  There i
6ca0: 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e  s also a referen
6cb0: 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54  ce count.  .** T
6cc0: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  he structure is 
6cd0: 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74  reclaimed when t
6ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69  he number of poi
6cf0: 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70  nters to it drop
6d00: 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a  s to.** zero..**
6d10: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65  .** There are ne
6d20: 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69  ver very many fi
6d30: 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20  les open at one 
6d40: 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73  time and lookups
6d50: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65   are not.** a pe
6d60: 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63  rformance-critic
6d70: 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69  al path, so it i
6d80: 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
6d90: 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72  put these.** str
6da0: 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e  uctures on a lin
6db0: 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72  ked list..*/.str
6dc0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6dd0: 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  d {.  struct vxw
6de0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78  orksFileId *pNex
6df0: 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61  t;  /* Next in a
6e00: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
6e10: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  l */.  int nRef;
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6e40: 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
6e50: 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e  this one */.  in
6e60: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6e80: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61  ength of the zCa
6e90: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74  nonicalName[] st
6ea0: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
6eb0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20  zCanonicalName; 
6ec0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e          /* Canon
6ed0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  ical filename */
6ee0: 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .};..#if OS_VXWO
6ef0: 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75  RKS./* .** All u
6f00: 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20  nique filenames 
6f10: 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69  are held on a li
6f20: 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64  nked list headed
6f30: 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   by this.** vari
6f40: 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  able:.*/.static 
6f50: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6f60: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c  leId *vxworksFil
6f70: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
6f80: 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c  * Simplify a fil
6f90: 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63  ename into its c
6fa0: 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a  anonical form.**
6fb0: 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66   by making the f
6fc0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
6fd0: 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76  :.**.**  * remov
6fe0: 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67  ing any trailing
6ff0: 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f   and duplicate /
7000: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
7010: 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a  ./ into just /.*
7020: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f  *  * convert /A/
7030: 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61  ../ where A is a
7040: 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69  ny simple name i
7050: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a  nto just /.**.**
7060: 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   Changes are mad
7070: 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74  e in-place.  Ret
7080: 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65  urn the new name
7090: 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54   length..**.** T
70a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
70b0: 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e  name is in z[0..
70c0: 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68  n-1].  Return th
70d0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  e number of.** c
70e0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
70f0: 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65   simplified name
7100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7110: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
7120: 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  ame(char *z, int
7130: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   n){.  int i, j;
7140: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
7150: 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20   z[n-1]=='/' ){ 
7160: 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a  n--; }.  for(i=j
7170: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
7180: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27     if( z[i]=='/'
7190: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
71a0: 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74  i+1]=='/' ) cont
71b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
71c0: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
71d0: 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +2<n && z[i+2]==
71e0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '/' ){.        i
71f0: 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63   += 1;.        c
7200: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
7210: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
7220: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20  ]=='.' && i+3<n 
7230: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26  && z[i+2]=='.' &
7240: 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b  & z[i+3]=='/' ){
7250: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
7260: 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27  j>0 && z[j-1]!='
7270: 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  /' ){ j--; }.   
7280: 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20       if( j>0 ){ 
7290: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
72a0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63   += 2;.        c
72b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
72c0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b  .    }.    z[j++
72d0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ] = z[i];.  }.  
72e0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  z[j] = 0;.  retu
72f0: 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn j;.}../*.** F
7300: 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ind a unique fil
7310: 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76  e ID for the giv
7320: 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  en absolute path
7330: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  name.  Return.**
7340: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7350: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
7360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f  object.  This po
7370: 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69  inter is the uni
7380: 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a  que.** file ID..
7390: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66  **.** The nRef f
73a0: 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f  ield of the vxwo
73b0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
73c0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
73d0: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62  before.** the ob
73e0: 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64  ject is returned
73f0: 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73  .  A new vxworks
7400: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
7410: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
7420: 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f  added to the glo
7430: 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65  bal list if nece
7440: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
7450: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
7460: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
7470: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
7480: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
7490: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76  vxworksFileId *v
74a0: 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
74b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62  (const char *zAb
74c0: 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73  soluteName){.  s
74d0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
74e0: 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  eId *pNew;      
74f0: 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79     /* search key
7500: 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44   and new file ID
7510: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77   */.  struct vxw
7520: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e  orksFileId *pCan
7530: 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72  didate;   /* For
7540: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
7550: 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20  isting file IDs 
7560: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
7590: 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e  th of zAbsoluteN
75a0: 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20  ame string */.. 
75b0: 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75   assert( zAbsolu
75c0: 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  teName[0]=='/' )
75d0: 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  ;.  n = (int)str
75e0: 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  len(zAbsoluteNam
75f0: 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  e);.  pNew = sql
7600: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
7610: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28  izeof(*pNew) + (
7620: 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  n+1) );.  if( pN
7630: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7640: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ;.  pNew->zCanon
7650: 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72  icalName = (char
7660: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65  *)&pNew[1];.  me
7670: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  mcpy(pNew->zCano
7680: 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f  nicalName, zAbso
7690: 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a  luteName, n+1);.
76a0: 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d    n = vxworksSim
76b0: 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e  plifyName(pNew->
76c0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
76d0: 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68  n);..  /* Search
76e0: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
76f0: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
7700: 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63  hing the canonic
7710: 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66  al name..  ** If
7720: 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e   found, incremen
7730: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
7740: 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  count and return
7750: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20   a pointer to.  
7760: 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ** the existing 
7770: 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20  file ID..  */.  
7780: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
7790: 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61  ;.  for(pCandida
77a0: 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  te=vxworksFileLi
77b0: 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20  st; pCandidate; 
77c0: 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64  pCandidate=pCand
77d0: 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  idate->pNext){. 
77e0: 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74     if( pCandidat
77f0: 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20  e->nName==n .   
7800: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e    && memcmp(pCan
7810: 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63  didate->zCanonic
7820: 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43  alName, pNew->zC
7830: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
7840: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
7850: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7860: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61  New);.       pCa
7870: 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b  ndidate->nRef++;
7880: 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  .       unixLeav
7890: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
78a0: 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61   return pCandida
78b0: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  te;.    }.  }.. 
78c0: 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73   /* No match was
78d0: 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c   found.  We will
78e0: 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65   make a new file
78f0: 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e   ID */.  pNew->n
7900: 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d  Ref = 1;.  pNew-
7910: 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e  >nName = n;.  pN
7920: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f  ew->pNext = vxwo
7930: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76  rksFileList;.  v
7940: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
7950: 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61   pNew;.  unixLea
7960: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
7970: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7980: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
7990: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
79a0: 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c   on a vxworksFil
79b0: 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65  eId object.  Fre
79c0: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
79d0: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
79e0: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
79f0: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
7a00: 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c   void vxworksRel
7a10: 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63  easeFileId(struc
7a20: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7a30: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74  *pId){.  unixEnt
7a40: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
7a50: 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30  ert( pId->nRef>0
7a60: 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d   );.  pId->nRef-
7a70: 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52  -;.  if( pId->nR
7a80: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ef==0 ){.    str
7a90: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
7aa0: 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28  d **pp;.    for(
7ab0: 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c  pp=&vxworksFileL
7ac0: 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21  ist; *pp && *pp!
7ad0: 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70  =pId; pp = &((*p
7ae0: 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20  p)->pNext)){}.  
7af0: 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70    assert( *pp==p
7b00: 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  Id );.    *pp = 
7b10: 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pId->pNext;.    
7b20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
7b30: 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
7b40: 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e  veMutex();.}.#en
7b50: 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
7b60: 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  S */./**********
7b70: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69  ***** End of Uni
7b80: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
7b90: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
7ba0: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
7bb0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c00: 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
7c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c50: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
7c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c70: 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72  ** Posix Advisor
7c80: 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
7c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ca0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53  ******.**.** POS
7cb0: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
7cc0: 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20  s are broken by 
7cd0: 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54  design.  ANSI ST
7ce0: 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a  D 1003.1 (1996).
7cf0: 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32  ** section 6.5.2
7d00: 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72  .2 lines 483 thr
7d10: 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79  ough 490 specify
7d20: 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f   that when a pro
7d30: 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20  cess.** sets or 
7d40: 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74  clears a lock, t
7d50: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76  hat operation ov
7d60: 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f  errides any prio
7d70: 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62  r locks set.** b
7d80: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
7d90: 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ss.  It does not
7da0: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20   explicitly say 
7db0: 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70  so, but this imp
7dc0: 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  lies.** that it 
7dd0: 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20  overrides locks 
7de0: 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20  set by the same 
7df0: 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20  process using a 
7e00: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
7e10: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
7e20: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73  onsider this tes
7e30: 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  t case:.**.**   
7e40: 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70      int fd1 = op
7e50: 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f  en("./file1", O_
7e60: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
7e70: 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e  44);.**       in
7e80: 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd2 = open("./
7e90: 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f  file2", O_RDWR|O
7ea0: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
7eb0: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66  *.** Suppose ./f
7ec0: 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32  ile1 and ./file2
7ed0: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
7ee0: 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75  same file (becau
7ef0: 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68  se.** one is a h
7f00: 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20  ard or symbolic 
7f10: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65  link to the othe
7f20: 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73  r) then if you s
7f30: 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69  et.** an exclusi
7f40: 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20  ve lock on fd1, 
7f50: 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20  then try to get 
7f60: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7f70: 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20  k.** on fd2, it 
7f80: 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20  works.  I would 
7f90: 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68  have expected th
7fa0: 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f  e second lock to
7fb0: 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74  .** fail since t
7fc0: 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79  here was already
7fd0: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
7fe0: 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a  ile due to fd1..
7ff0: 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20  ** But not so.  
8000: 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73  Since both locks
8010: 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73   came from the s
8020: 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ame process, the
8030: 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72  .** second overr
8040: 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20  ides the first, 
8050: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
8060: 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65   were on differe
8070: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
8080: 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e  iptors opened on
8090: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
80a0: 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  names..**.** Thi
80b0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  s means that we 
80c0: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
80d0: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
80e0: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
80f0: 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65  s.** among compe
8100: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
8110: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
8120: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
8130: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
8140: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
8150: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
8160: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
8170: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
8180: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
8190: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
81a0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
81b0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
81c0: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
81d0: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
81e0: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
81f0: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
8200: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
8210: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
8220: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
8230: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
8240: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
8250: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8260: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
8270: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
8280: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
8290: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
82a0: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
82b0: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
82c0: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
82d0: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
82e0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
82f0: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
8300: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
8310: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
8320: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
8330: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
8340: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
8350: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
8360: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
8370: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
8380: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
8390: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
83a0: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
83b0: 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75  ** (Aside: The u
83c0: 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62  se of inode numb
83d0: 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44  ers as unique ID
83e0: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
83f0: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46  on VxWorks..** F
8400: 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68  or VxWorks, we h
8410: 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61  ave to use the a
8420: 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75  lternative uniqu
8430: 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65  e ID system base
8440: 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61  d on.** canonica
8450: 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  l filename and i
8460: 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68  mplemented in th
8470: 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73  e previous divis
8480: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ion.).**.** The 
8490: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
84a0: 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58  ucture for POSIX
84b0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75   is no longer ju
84c0: 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69  st an integer fi
84d0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
84e0: 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73  .  It is now a s
84f0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f  tructure that ho
8500: 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  lds the integer 
8510: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
8520: 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  or and a pointer
8530: 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
8540: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
8550: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c  he internal.** l
8560: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72  ocks on the corr
8570: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e  esponding inode.
8580: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c    There is one l
8590: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
85a0: 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73  .** per inode, s
85b0: 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e  o if the same in
85c0: 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77  ode is opened tw
85d0: 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69  ice, both unixFi
85e0: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
85f0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
8600: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
8610: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
8620: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
8630: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
8640: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
8650: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
8660: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
8670: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
8680: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
8690: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
86a0: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
86b0: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
86c0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
86d0: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
86e0: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
86f0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
8700: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
8710: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
8720: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
8730: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
8740: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
8750: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
8760: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
8770: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
8780: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
8790: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
87a0: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
87b0: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
87c0: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
87d0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
87e0: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
87f0: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
8800: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
8810: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
8820: 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20  *.** But wait:  
8830: 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f  there are yet mo
8840: 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  re problems with
8850: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
8860: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  locks..**.** If 
8870: 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65  you close a file
8880: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
8890: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c   points to a fil
88a0: 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73  e that has locks
88b0: 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f  ,.** all locks o
88c0: 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
88d0: 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68   are owned by th
88e0: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
88f0: 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65  s are.** release
8900: 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  d.  To work arou
8910: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c  nd this problem,
8920: 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49   each unixInodeI
8930: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61  nfo object.** ma
8940: 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20  intains a count 
8950: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
8960: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f   pending locks o
8970: 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20  n tha inode..** 
8980: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
8990: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
89a0: 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66   an unixFile, if
89b0: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74   there are.** ot
89c0: 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65  her unixFile ope
89d0: 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e  n on the same in
89e0: 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c  ode that are hol
89f0: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20  ding locks, the 
8a00: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65  call.** to close
8a10: 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  () the file desc
8a20: 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72  riptor is deferr
8a30: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20  ed until all of 
8a40: 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e  the locks clear.
8a50: 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64  .** The unixInod
8a60: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
8a70: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
8a80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8a90: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
8aa0: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
8ab0: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
8ac0: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
8ad0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
8ae0: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
8af0: 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72  *.** Yet another
8b00: 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78   problem:  Linux
8b10: 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70  Threads do not p
8b20: 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f  lay well with po
8b30: 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  six locks..**.**
8b40: 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73   Many older vers
8b50: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73  ions of linux us
8b60: 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61  e the LinuxThrea
8b70: 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68  ds library which
8b80: 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78   is.** not posix
8b90: 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64   compliant.  Und
8ba0: 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  er LinuxThreads,
8bb0: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
8bc0: 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63  by thread.** A c
8bd0: 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  annot be modifie
8be0: 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20  d or overridden 
8bf0: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
8c00: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79  hread B..** Only
8c10: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f   thread A can mo
8c20: 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20  dify the lock.  
8c30: 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  Locking behavior
8c40: 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69   is correct.** i
8c50: 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e  f the appliation
8c60: 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20   uses the newer 
8c70: 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72  Native Posix Thr
8c80: 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54  ead Library (NPT
8c90: 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d  L).** on linux -
8ca0: 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63   with NPTL a loc
8cb0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
8cc0: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
8cd0: 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74  de locks.** in t
8ce0: 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68  hread B.  But th
8cf0: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
8d00: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
8d10: 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74  -time which.** t
8d20: 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79  hreading library
8d30: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
8d40: 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
8d50: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a  way to know at.*
8d60: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  * compile-time w
8d70: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
8d80: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8d90: 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72  ide locks on thr
8da0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61  ead B..** One ha
8db0: 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69  s to do a run-ti
8dc0: 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63  me check to disc
8dd0: 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f  over the behavio
8de0: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  r of the.** curr
8df0: 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ent process..**.
8e00: 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74  ** SQLite used t
8e10: 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54  o support LinuxT
8e20: 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70  hreads.  But sup
8e30: 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68  port for LinuxTh
8e40: 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f  reads.** was dro
8e50: 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77  pped beginning w
8e60: 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e  ith version 3.7.
8e70: 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  0.  SQLite will 
8e80: 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a  still work with.
8e90: 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  ** LinuxThreads 
8ea0: 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31  provided that (1
8eb0: 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f  ) there is no mo
8ec0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e  re than one conn
8ed0: 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64  ection .** per d
8ee0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
8ef0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
8f00: 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73   and (2) databas
8f10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
8f20: 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72   do not move acr
8f30: 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a  oss threads..*/.
8f40: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
8f50: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
8f60: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
8f70: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
8f80: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
8f90: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75  e a particular u
8fa0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
8fb0: 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ect..*/.struct u
8fc0: 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65  nixFileId {.  de
8fd0: 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20  v_t dev;        
8fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
8ff0: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
9000: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
9010: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
9020: 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e  eId *pId;  /* Un
9030: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
9040: 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c   vxworks. */.#el
9050: 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  se.  ino_t ino; 
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
9080: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9090: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
90a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
90b0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
90c0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
90d0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
90e0: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
90f0: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
9100: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
9110: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
9120: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
9130: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
9140: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
9150: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
9160: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
9170: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
9180: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
9190: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
91a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
91b0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
91c0: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
91d0: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
91e0: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
91f0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
9200: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
9210: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
9220: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
9230: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
9240: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
9250: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
9260: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
9270: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
9280: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9290: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
92a0: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
92b0: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
92c0: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
92d0: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
92e0: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
92f0: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
9300: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
9310: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
9320: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
9330: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
9340: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9370: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
9380: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
9390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
93a0: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
93b0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
93c0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
93d0: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
93e0: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
9410: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
9420: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
9430: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
9440: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
9450: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
9460: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
9470: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9480: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
9490: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
94a0: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
94b0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
94c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
94d0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
94e0: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
94f0: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
9500: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
9510: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
9520: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
9530: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
9540: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
9550: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
9560: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
9570: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
9580: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
9590: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
95a0: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
95b0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
95c0: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
95d0: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
95e0: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
95f0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
9600: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
9610: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9620: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
9630: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
9640: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
9650: 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ;../*.**.** This
9660: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78   function - unix
9670: 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73  LogError_x(), is
9680: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
9690: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
96a0: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
96b0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
96c0: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
96d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
96e0: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
96f0: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
9700: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
9710: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
9720: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
9730: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9740: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
9750: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
9760: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
9770: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
9780: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
9790: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
97a0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
97b0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
97c0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
97d0: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
97e0: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
97f0: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
9800: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
9810: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
9820: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
9830: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9840: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
9850: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
9860: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
9870: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
9880: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
9890: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
98a0: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
98b0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
98c0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
98d0: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
98e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
98f0: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
9900: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
9910: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
9920: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
9930: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
9940: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
9950: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
9960: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
9970: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
9980: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
9990: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
99a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
99b0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
99c0: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
99d0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
99e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
99f0: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
9a00: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
9a10: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
9a40: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
9a50: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
9a60: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
9a90: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
9aa0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
9ab0: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
9ac0: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
9ad0: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
9ae0: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
9af0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
9b00: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
9b10: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
9b20: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
9b30: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
9b40: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
9b50: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
9b60: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
9b70: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
9b80: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
9b90: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
9ba0: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
9bb0: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
9bc0: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
9bd0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
9be0: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
9bf0: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
9c00: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
9c10: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
9c20: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
9c30: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
9c40: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
9c50: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
9c60: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
9c70: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
9c80: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
9c90: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
9ca0: 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20  rovides the GNU 
9cb0: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
9cc0: 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a  ror_r() that.  *
9cd0: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
9ce0: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
9cf0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
9d00: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
9d10: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
9d20: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
9d30: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
9d40: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
9d50: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
9d60: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
9d70: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
9d80: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
9d90: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
9da0: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
9db0: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
9dc0: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
9dd0: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
9de0: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
9df0: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
9e00: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
9e10: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
9e20: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
9e30: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
9e40: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
9e50: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
9e60: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
9e70: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
9e80: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
9e90: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
9ea0: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
9eb0: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
9ec0: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
9ed0: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
9ee0: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
9ef0: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
9f00: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
9f10: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
9f20: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
9f30: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
9f40: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
9f50: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
9f60: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
9f70: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
9f80: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
9f90: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
9fa0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
9fb0: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
9fc0: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
9fd0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
9fe0: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
9ff0: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
a000: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
a010: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
a020: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
a030: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
a040: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
a050: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
a060: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
a070: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
a080: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
a090: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
a0a0: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
a0b0: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
a0c0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
a0d0: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
a0e0: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
a0f0: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
a100: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
a110: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
a120: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
a130: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
a140: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
a150: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
a160: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
a170: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
a180: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
a190: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
a1a0: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
a1b0: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
a1c0: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
a1d0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
a1e0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
a1f0: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
a200: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
a210: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
a220: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
a230: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
a240: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
a250: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
a260: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
a270: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
a280: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
a290: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
a2a0: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
a2b0: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
a2c0: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
a2d0: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
a2e0: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
a2f0: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
a300: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
a310: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
a320: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
a330: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
a360: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
a370: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
a380: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46  /*.** Set the pF
a390: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20  ile->lastErrno. 
a3a0: 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   Do this in a su
a3b0: 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74  broutine as that
a3c0: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63   provides.** a c
a3d0: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
a3e0: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
a3f0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
a400: 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72  oid storeLastErr
a410: 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  no(unixFile *pFi
a420: 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a  le, int error){.
a430: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a440: 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f  no = error;.}../
a450: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
a460: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
a470: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
a480: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
a490: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
a4a0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
a4b0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
a4c0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
a4d0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a4e0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
a4f0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
a500: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
a510: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
a520: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
a530: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
a540: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
a550: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
a560: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
a570: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
a580: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
a590: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
a5a0: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
a5b0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
a5c0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
a5d0: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
a5e0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
a5f0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
a600: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
a610: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
a620: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
a630: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
a640: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
a650: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
a660: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a670: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
a680: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
a690: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
a6a0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
a6b0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
a6c0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
a6d0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
a6e0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
a6f0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
a700: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
a710: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
a720: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
a730: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
a740: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
a750: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
a760: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
a770: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
a780: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
a790: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
a7a0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
a7b0: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
a7c0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
a7d0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
a7e0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
a7f0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
a800: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a810: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
a820: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
a830: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
a840: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
a850: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
a860: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
a870: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
a880: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
a890: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
a8a0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
a8b0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
a8c0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
a8d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
a8e0: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
a8f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a900: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
a910: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
a920: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
a930: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
a940: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
a950: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
a960: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
a970: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
a980: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
a990: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75  value might be u
a9a0: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
a9b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
a9c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
a9d0: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
a9e0: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
a9f0: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
aa00: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
aa10: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
aa20: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
aa30: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
aa40: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
aa50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
aa60: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
aa70: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
aa80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
aa90: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
aaa0: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
aab0: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
aac0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
aad0: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
aae0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
aaf0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
ab00: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
ab10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
ab40: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ab50: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab70: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
ab80: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
ab90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
aba0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
abb0: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
abc0: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
abd0: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
abe0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
abf0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
ac00: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
ac10: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
ac20: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
ac30: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
ac40: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
ac50: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
ac60: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
ac70: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
ac80: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
ac90: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
aca0: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
acb0: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
acc0: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
acd0: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
ace0: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
acf0: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
ad00: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
ad10: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
ad20: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
ad30: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
ad40: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
ad50: 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f  .#ifdef EOVERFLO
ad60: 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  W.    if( pFile-
ad70: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45  >lastErrno==EOVE
ad80: 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53  RFLOW ) return S
ad90: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e  QLITE_NOLFS;.#en
ada0: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
adb0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
adc0: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
add0: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  __.  /* On OS X 
ade0: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
adf0: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
ae00: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
ae10: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
ae20: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
ae30: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
ae40: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
ae50: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
ae60: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
ae70: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
ae80: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
ae90: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
aea0: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
aeb0: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
aec0: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
aed0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
aee0: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
aef0: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
af00: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
af10: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
af20: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
af30: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
af40: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
af50: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
af60: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
af70: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
af80: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
af90: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
afa0: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
afb0: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
afc0: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
afd0: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
afe0: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
aff0: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
b000: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
b010: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
b020: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
b030: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
b040: 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c  size==0 && (pFil
b050: 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c  e->fsFlags & SQL
b060: 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
b070: 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20  SDOS)!=0 ){.    
b080: 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65  do{ rc = osWrite
b090: 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77  (fd, "S", 1); }w
b0a0: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
b0b0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
b0c0: 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20    if( rc!=1 ){. 
b0d0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
b0e0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
b0f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b100: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
b110: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46    }.    rc = osF
b120: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
b130: 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  f);.    if( rc!=
b140: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  0 ){.      store
b150: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
b160: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
b170: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
b180: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
b190: 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ndif..  memset(&
b1a0: 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f  fileId, 0, sizeo
b1b0: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69  f(fileId));.  fi
b1c0: 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62  leId.dev = statb
b1d0: 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f  uf.st_dev;.#if O
b1e0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65  S_VXWORKS.  file
b1f0: 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e  Id.pId = pFile->
b200: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c  pId;.#else.  fil
b210: 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  eId.ino = statbu
b220: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66  f.st_ino;.#endif
b230: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64  .  pInode = inod
b240: 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
b250: 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70  pInode && memcmp
b260: 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64  (&fileId, &pInod
b270: 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  e->fileId, sizeo
b280: 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20  f(fileId)) ){.  
b290: 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
b2a0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  e->pNext;.  }.  
b2b0: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
b2c0: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71  .    pInode = sq
b2d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
b2e0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
b2f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
b300: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
b310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b320: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
b330: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
b340: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
b350: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
b360: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
b370: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
b380: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
b390: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
b3a0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
b3b0: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
b3c0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
b3d0: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
b3e0: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
b3f0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
b400: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
b410: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
b420: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
b430: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
b440: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
b450: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b460: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
b470: 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69 6c  urn TRUE if pFil
b480: 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d  e has been renam
b490: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73  ed or unlinked s
b4a0: 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72 73  ince it was firs
b4b0: 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61  t opened..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73 4d  tic int fileHasM
b4d0: 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  oved(unixFile *p
b4e0: 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56 58  File){.#if OS_VX
b4f0: 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 70  WORKS.  return p
b500: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
b510: 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d 70  && pFile->pId!=p
b520: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69  File->pInode->fi
b530: 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65 0a  leId.pId;.#else.
b540: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
b550: 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c  f;.  return pFil
b560: 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a  e->pInode!=0 &&.
b570: 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70 46        (osStat(pF
b580: 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75 66  ile->zPath, &buf
b590: 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f 69  )!=0 || buf.st_i
b5a0: 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  no!=pFile->pInod
b5b0: 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a  e->fileId.ino);.
b5c0: 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
b5d0: 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c   Check a unixFil
b5e0: 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61  e that is a data
b5f0: 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68  base.  Verify th
b600: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
b610: 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20  ** (1) There is 
b620: 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64  exactly one hard
b630: 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c   link on the fil
b640: 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c  e.** (2) The fil
b650: 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f  e is not a symbo
b660: 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20  lic link.** (3) 
b670: 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  The file has not
b680: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
b690: 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20   unlinked.**.** 
b6a0: 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f  Issue sqlite3_lo
b6b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b6c0: 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69  ,...) messages i
b6d0: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f  f anything is no
b6e0: 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  t right..*/.stat
b6f0: 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62  ic void verifyDb
b700: 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
b710: 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20  File){.  struct 
b720: 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20  stat buf;.  int 
b730: 72 63 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  rc;.  if( pFile-
b740: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
b750: 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 29 7b 0a  XFILE_WARNED ){.
b760: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f      /* One or mo
b770: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
b780: 69 6e 67 20 77 61 72 6e 69 6e 67 73 20 68 61 76  ing warnings hav
b790: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  e already been i
b7a0: 73 73 75 65 64 2e 20 20 44 6f 20 6e 6f 74 0a 20  ssued.  Do not. 
b7b0: 20 20 20 2a 2a 20 72 65 70 65 61 74 20 74 68 65     ** repeat the
b7c0: 6d 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20 63  m so as not to c
b7d0: 6c 75 74 74 65 72 20 74 68 65 20 65 72 72 6f 72  lutter the error
b7e0: 20 6c 6f 67 20 2a 2f 0a 20 20 20 20 72 65 74 75   log */.    retu
b7f0: 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6f  rn;.  }.  rc = o
b800: 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
b810: 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63   &buf);.  if( rc
b820: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
b830: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b840: 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66  RNING, "cannot f
b850: 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22  stat db file %s"
b860: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b870: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
b880: 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
b890: 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65  E_WARNED;.    re
b8a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b8b0: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20  buf.st_nlink==0 
b8c0: 26 26 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  && (pFile->ctrlF
b8d0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b8e0: 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
b8f0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b900: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
b910: 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69  ile unlinked whi
b920: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
b930: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
b940: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
b950: 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41  s |= UNIXFILE_WA
b960: 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  RNED;.    return
b970: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e  ;.  }.  if( buf.
b980: 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20  st_nlink>1 ){.  
b990: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b9a0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d  LITE_WARNING, "m
b9b0: 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f  ultiple links to
b9c0: 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c   file: %s", pFil
b9d0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b9e0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b9f0: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
ba00: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
ba10: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48 61    }.  if( fileHa
ba20: 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29 7b  sMoved(pFile) ){
ba30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
ba40: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
ba50: 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20 77   "file renamed w
ba60: 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20  hile open: %s", 
ba70: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
ba80: 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
ba90: 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
baa0: 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75  WARNED;.    retu
bab0: 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn;.  }.}.../*.*
bac0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
bad0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
bae0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
baf0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
bb00: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
bb10: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
bb20: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
bb30: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
bb40: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
bb50: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
bb60: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
bb70: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
bb80: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
bb90: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
bba0: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
bbb0: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
bbc0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
bbd0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
bbe0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
bbf0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
bc00: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
bc10: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
bc20: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
bc30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bc40: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
bc50: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
bc60: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
bc70: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
bc80: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
bc90: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
bca0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
bcb0: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
bcc0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
bcd0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
bce0: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
bcf0: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
bd00: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
bd10: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
bd20: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
bd30: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
bd40: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
bd50: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
bd60: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
bd70: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
bd80: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
bd90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
bda0: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
bdb0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
bdc0: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
bdd0: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
bde0: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
bdf0: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
be00: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
be10: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
be20: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
be30: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
be40: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
be50: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
be60: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
be70: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
be80: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
be90: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
bea0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
beb0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
bec0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  k) ){.      rc =
bed0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
bee0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
bef0: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
bf00: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
bf10: 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  no);.    } else 
bf20: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
bf30: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
bf40: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
bf50: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
bf60: 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
bf70: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
bf80: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
bf90: 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29   %d %d %d (unix)
bfa0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
bfb0: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
bfc0: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
bfd0: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
bfe0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
bff0: 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79  empt to set a sy
c000: 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  stem-lock on the
c010: 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68   file pFile.  Th
c020: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65  e lock is .** de
c030: 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b  scribed by pLock
c040: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
c050: 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  File was opened 
c060: 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20  read/write from 
c070: 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20  unix-excl, then 
c080: 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a  the only lock.**
c090: 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69   ever obtained i
c0a0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
c0b0: 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f  ock, and it is o
c0c0: 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20  btained exactly 
c0d0: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73  once.** the firs
c0e0: 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20  t time any lock 
c0f0: 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41  is attempted.  A
c100: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79  ll subsequent sy
c110: 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  stem locking.** 
c120: 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d  operations becom
c130: 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69  e no-ops.  Locki
c140: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74  ng operations st
c150: 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72  ill happen inter
c160: 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64  nally,.** in ord
c170: 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  er to coordinate
c180: 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20   access between 
c190: 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73  separate databas
c1a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
c1b0: 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f   within this pro
c1c0: 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66  cess, but all of
c1d0: 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64   that is handled
c1e0: 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74   in memory and t
c1f0: 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  he.** operating 
c200: 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
c210: 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a  participate..**.
c220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c230: 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75   is a pass-throu
c240: 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45  gh to fcntl(F_SE
c250: 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73  TLK) if pFile is
c260: 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46   using.** any VF
c270: 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e  S other than "un
c280: 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70  ix-excl" or if p
c290: 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f  File is opened o
c2a0: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a  n "unix-excl".**
c2b0: 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c   and is read-onl
c2c0: 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  y..**.** Zero is
c2d0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
c2e0: 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20   call completes 
c2f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72  successfully, or
c300: 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a   -1 if a call.**
c310: 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c   to fcntl() fail
c320: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  s. In this case,
c330: 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70   errno is set ap
c340: 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20  propriately (by 
c350: 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61  fcntl())..*/.sta
c360: 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
c370: 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
c380: 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f  File, struct flo
c390: 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e  ck *pLock){.  in
c3a0: 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  t rc;.  unixInod
c3b0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
c3c0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
c3d0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
c3e0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73  exHeld() );.  as
c3f0: 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20  sert( pInode!=0 
c400: 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65  );.  if( ((pFile
c410: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
c420: 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20  IXFILE_EXCL)!=0 
c430: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  || pInode->bProc
c440: 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28  essLock).   && (
c450: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
c460: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
c470: 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  NLY)==0).  ){.  
c480: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
c490: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
c4a0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c  .      struct fl
c4b0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  ock lock;.      
c4c0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
c4d0: 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  nLock==0 );.    
c4e0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
c4f0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
c500: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c510: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
c520: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
c530: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
c540: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
c550: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
c560: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
c570: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
c580: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  , &lock);.      
c590: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
c5a0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
c5b0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
c5c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
c5d0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
c5e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
c5f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
c600: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  lse{.    rc = os
c610: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
c620: 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b  F_SETLK, pLock);
c630: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
c650: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
c660: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
c670: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
c680: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
c690: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
c6a0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
c6b0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
c6c0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
c6d0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
c6e0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
c6f0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
c700: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
c710: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
c720: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
c730: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
c740: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
c750: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
c760: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
c770: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
c780: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
c790: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
c7a0: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
c7b0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
c7c0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
c7d0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
c7e0: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
c7f0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
c800: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
c810: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
c820: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
c830: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
c840: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
c850: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
c860: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
c870: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
c880: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
c890: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
c8a0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
c8b0: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
c8c0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
c8d0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
c8e0: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
c8f0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
c900: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c910: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
c920: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
c930: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
c940: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
c950: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
c960: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
c970: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c  int unixLock(sql
c980: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
c990: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
c9a0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
c9b0: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
c9c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
c9d0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
c9e0: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
c9f0: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
ca00: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
ca10: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
ca20: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
ca30: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
ca40: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
ca50: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
ca60: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
ca70: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
ca80: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
ca90: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
caa0: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
cab0: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
cac0: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
cad0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
cae0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
caf0: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
cb00: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
cb10: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
cb20: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
cb30: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
cb40: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
cb50: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
cb60: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
cb70: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
cb80: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
cb90: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
cba0: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
cbb0: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
cbc0: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
cbd0: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
cbe0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
cbf0: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
cc00: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
cc10: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
cc20: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
cc30: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
cc40: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
cc50: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
cc60: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
cc70: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
cc80: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
cc90: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
cca0: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
ccb0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
ccc0: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
ccd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
cce0: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
ccf0: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
cd00: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
cd10: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
cd20: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
cd30: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
cd40: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
cd50: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
cd60: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
cd70: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
cd80: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
cd90: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
cda0: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
cdb0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
cdc0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
cdd0: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
cde0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
cdf0: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
ce00: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
ce10: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
ce20: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
ce30: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
ce40: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
ce50: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
ce60: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
ce70: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
ce80: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
ce90: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
cea0: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
ceb0: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
cec0: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
ced0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
cee0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
cef0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
cf00: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
cf10: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
cf20: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
cf30: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
cf40: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
cf50: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
cf60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
cf70: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
cf80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
cf90: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
cfa0: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
cfb0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
cfc0: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
cfd0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
cfe0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
cff0: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
d000: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
d010: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
d020: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
d030: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
d040: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
d050: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
d060: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
d070: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
d080: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
d090: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
d0a0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d0b0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
d0c0: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
d0d0: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
d0e0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
d0f0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
d100: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
d110: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
d120: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
d130: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
d140: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
d150: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
d160: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
d170: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
d180: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
d190: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
d1a0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
d1b0: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
d1c0: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
d1d0: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
d1e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d1f0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
d200: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d210: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
d220: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
d230: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
d240: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
d250: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
d260: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
d270: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
d280: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
d290: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
d2a0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
d2b0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
d2c0: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
d2d0: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
d2e0: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
d2f0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
d300: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d310: 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  k), pFile->pInod
d320: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
d330: 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
d340: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d350: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
d360: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
d370: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
d380: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
d390: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
d3a0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
d3b0: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
d3c0: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
d3d0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
d3e0: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
d3f0: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
d400: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d410: 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
d420: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
d430: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
d440: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
d450: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
d460: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
d470: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
d480: 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
d490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d4a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d4b0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
d4c0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
d4d0: 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20  rect..  **  (1) 
d4e0: 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
d4f0: 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
d500: 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
d510: 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
d520: 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
d530: 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
d540: 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
d550: 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
d560: 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
d570: 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
d580: 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
d590: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
d5a0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
d5b0: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
d5c0: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
d5d0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d5e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
d5f0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
d600: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
d610: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d620: 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
d630: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
d640: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d650: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
d660: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
d670: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
d680: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
d690: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
d6a0: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
d6b0: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
d6c0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
d6d0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
d6e0: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
d6f0: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
d700: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
d710: 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
d720: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
d730: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
d740: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
d750: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
d760: 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
d770: 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
d780: 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
d790: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
d7a0: 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
d7b0: 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
d7c0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
d7d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
d7e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
d7f0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
d800: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
d810: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
d820: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
d830: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
d840: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
d850: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
d860: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
d870: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
d880: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
d890: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
d8a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
d8b0: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
d8c0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d8d0: 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f   && .      (pIno
d8e0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
d8f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
d900: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d910: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
d920: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
d930: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d940: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
d950: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
d960: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
d970: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d980: 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
d990: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d9a0: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
d9b0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
d9c0: 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
d9d0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
d9e0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
d9f0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e    }...  /* A PEN
da00: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
da10: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
da20: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
da30: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
da40: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
da50: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
da60: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
da70: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
da80: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
da90: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
daa0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
dab0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
dac0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69   = SEEK_SET;.  i
dad0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
dae0: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
daf0: 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
db00: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
db10: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
db20: 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
db30: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
db40: 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f  _type = (eFileLo
db50: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  ck==SHARED_LOCK?
db60: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
db70: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
db80: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
db90: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
dba0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
dbb0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
dbc0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
dbd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dbe0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
dbf0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
dc00: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
dc10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
dc20: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
dc30: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
dc40: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
dc50: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
dc60: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
dc70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
dc80: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
dc90: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
dca0: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
dcb0: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
dcc0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
dcd0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
dce0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
dcf0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
dd00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
dd10: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
dd20: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
dd30: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
dd40: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
dd50: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
dd60: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
dd70: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
dd80: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
dd90: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
dda0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ddb0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
ddc0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ddd0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
dde0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
ddf0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
de00: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
de10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
de20: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
de30: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
de40: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
de50: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
de60: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
de70: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
de80: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
de90: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
dea0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
deb0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
dec0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
ded0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
dee0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
def0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
df00: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
df10: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
df20: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
df30: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
df40: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
df50: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
df60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
df70: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
df80: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
df90: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
dfa0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
dfb0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
dfc0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
dfd0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
dfe0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
dff0: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
e000: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e010: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
e020: 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
e030: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
e040: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
e050: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
e060: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
e070: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e080: 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
e090: 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
e0a0: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
e0b0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
e0c0: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
e0d0: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
e0e0: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
e0f0: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
e100: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
e110: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
e120: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
e130: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
e140: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
e150: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
e160: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
e170: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
e180: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
e190: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
e1a0: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
e1b0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
e1c0: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
e1d0: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
e1e0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
e1f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
e200: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20  e = F_WRLCK;..  
e210: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
e220: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
e230: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
e240: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
e250: 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  );.    if( eFile
e260: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
e270: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
e280: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
e290: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
e2a0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
e2b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e2c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e2d0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
e2e0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e2f0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
e300: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
e310: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e320: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
e330: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
e340: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
e350: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
e360: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
e370: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
e380: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
e390: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
e3a0: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
e3b0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e3c0: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
e3d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69      }.  }.  ..#i
e3e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
e3f0: 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  G.  /* Set up th
e400: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f  e transaction-co
e410: 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65  unter change che
e420: 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e  cking flags when
e430: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  .  ** transition
e440: 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45  ing from a SHARE
e450: 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20  D to a RESERVED 
e460: 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67  lock.  The chang
e470: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52  e.  ** from SHAR
e480: 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d  ED to RESERVED m
e490: 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69  arks the beginni
e4a0: 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20  ng of a normal. 
e4b0: 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74   ** write operat
e4c0: 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a  ion (not a hot j
e4d0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
e4e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
e4f0: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
e500: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e510: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20  k<=SHARED_LOCK. 
e520: 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d    && eFileLock==
e530: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20  RESERVED_LOCK.  
e540: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  ){.    pFile->tr
e550: 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b  ansCntrChng = 0;
e560: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
e570: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  date = 0;.    pF
e580: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
e590: 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  te = 1;.  }.#end
e5a0: 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  if...  if( rc==S
e5b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e5c0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e5d0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
e5e0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
e5f0: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
e600: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
e610: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
e620: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
e630: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e640: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
e650: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
e660: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
e670: 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f  OCK;.  }..end_lo
e680: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
e690: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
e6a0: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
e6b0: 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20  s %s (unix)\n", 
e6c0: 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
e6d0: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
e6e0: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
e6f0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
e700: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
e710: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e720: 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65   Add the file de
e730: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79  scriptor used by
e740: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69   file handle pFi
e750: 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73  le to the corres
e760: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73  ponding.** pUnus
e770: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ed list..*/.stat
e780: 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69  ic void setPendi
e790: 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  ngFd(unixFile *p
e7a0: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
e7b0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
e7c0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
e7d0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
e7e0: 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  p = pFile->pUnus
e7f0: 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  ed;.  p->pNext =
e800: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
e810: 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  ;.  pInode->pUnu
e820: 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65  sed = p;.  pFile
e830: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c  ->h = -1;.  pFil
e840: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
e850: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
e860: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
e870: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
e880: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
e890: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
e8a0: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
e8b0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
e8c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
e8d0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
e8e0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
e8f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
e900: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
e910: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
e920: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
e930: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
e940: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
e950: 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e  * .** If handleN
e960: 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65  FSUnlock is true
e970: 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72  , then on downgr
e980: 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  ading an EXCLUSI
e990: 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45  VE_LOCK to SHARE
e9a0: 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61  D.** the byte ra
e9b0: 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69  nge is divided i
e9c0: 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20  nto 2 parts and 
e9d0: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69  the first part i
e9e0: 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a  s unlocked then.
e9f0: 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64  ** set to a read
ea00: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
ea10: 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69  other part is si
ea20: 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  mply unlocked.  
ea30: 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61  This works .** a
ea40: 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42  round a bug in B
ea50: 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c  SD NFS lockd (al
ea60: 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53  so seen on MacOS
ea70: 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61  X 10.3+) that fa
ea80: 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76  ils to .** remov
ea90: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
eaa0: 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65   on a region whe
eab0: 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
eac0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
ead0: 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  int posixUnlock(
eae0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
eaf0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c  , int eFileLock,
eb00: 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e   int handleNFSUn
eb10: 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c  lock){.  unixFil
eb20: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
eb30: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
eb40: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
eb50: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
eb60: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63  k lock;.  int rc
eb70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
eb80: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
eb90: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
eba0: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
ebb0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
ebc0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
ebd0: 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
ebe0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
ebf0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
ec00: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
ec10: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
ec20: 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
ec30: 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
ec40: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
ec50: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
ec60: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
ec70: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
ec80: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
ec90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
eca0: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
ecb0: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
ecc0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
ecd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
ece0: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
ecf0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
ed00: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
ed10: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
ed20: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
ed30: 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
ed40: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64  ileLock );..#ifd
ed50: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ed60: 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
ed70: 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
ed80: 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
ed90: 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
eda0: 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
edb0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
edc0: 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
edd0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
ede0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
edf0: 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
ee00: 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
ee10: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
ee20: 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
ee30: 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
ee40: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
ee50: 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
ee60: 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
ee70: 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
ee80: 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
ee90: 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
eea0: 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
eeb0: 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
eec0: 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
eed0: 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
eee0: 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
eef0: 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
ef00: 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
ef10: 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
ef20: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
ef30: 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   */.    pFile->i
ef40: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
ef50: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
ef60: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20   downgrading to 
ef70: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
ef80: 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c   NFS involves cl
ef90: 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65  earing the write
efa0: 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66   lock.    ** bef
efb0: 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67  ore establishing
efc0: 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20   the readlock - 
efd0: 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20  to avoid a race 
efe0: 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77  condition we dow
eff0: 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68  ngrade.    ** th
f000: 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63  e lock in 2 bloc
f010: 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74  ks, so that part
f020: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69   of the range wi
f030: 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79  ll be covered by
f040: 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65   a .    ** write
f050: 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20   lock until the 
f060: 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20  rest is covered 
f070: 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a  by a read lock:.
f080: 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57      **  1:   [WW
f090: 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20  WWW].    **  2: 
f0a0: 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a    [....W].    **
f0b0: 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20    3:   [RRRRW]. 
f0c0: 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52     **  4:   [RRR
f0d0: 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  R.].    */.    i
f0e0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
f0f0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69 66  ARED_LOCK ){.#if
f100: 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c   !defined(__APPL
f110: 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  E__) || !SQLITE_
f120: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f130: 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64  TYLE.      (void
f140: 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b  )handleNFSUnlock
f150: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f160: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d  handleNFSUnlock=
f170: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =0 );.#endif.#if
f180: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
f190: 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
f1a0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
f1b0: 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e  LE.      if( han
f1c0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a  dleNFSUnlock ){.
f1d0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
f1e0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
f1f0: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
f200: 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c  from system call
f210: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20   errors */.     
f220: 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65     off_t divSize
f230: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d   = SHARED_SIZE -
f240: 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   1;.        .   
f250: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
f260: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
f270: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
f280: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
f290: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
f2a0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
f2b0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f2c0: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
f2d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
f2e0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
f2f0: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
f300: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
f310: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
f320: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f330: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
f340: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
f350: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
f360: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
f370: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
f380: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
f390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f3a0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
f3b0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
f3c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
f3d0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
f3e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f3f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f400: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f410: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f420: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
f430: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
f440: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f450: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f460: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
f470: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
f480: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f490: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f4a0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
f4b0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
f4c0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
f4d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
f4e0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
f4f0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
f500: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f510: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
f520: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f530: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
f540: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
f550: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
f560: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
f570: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f580: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f590: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f5a0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
f5b0: 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a  _FIRST+divSize;.
f5c0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
f5d0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
f5e0: 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  -divSize;.      
f5f0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f600: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f610: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f620: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f630: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f640: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f650: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f660: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
f670: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
f680: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
f690: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
f6a0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
f6b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
f6c0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f6d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f6e0: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
f6f0: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
f700: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
f710: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
f720: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
f730: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f740: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
f750: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f760: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f770: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f780: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
f790: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
f7a0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
f7b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f7c0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f7d0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
f7e0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
f7f0: 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
f800: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
f810: 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
f820: 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
f830: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
f840: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
f850: 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
f860: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
f870: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f880: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
f890: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
f8a0: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
f8b0: 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
f8c0: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
f8d0: 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
f8e0: 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
f8f0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
f900: 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
f910: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
f920: 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
f930: 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
f940: 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
f950: 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
f960: 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
f970: 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
f980: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f990: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
f9a0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  CK;.          st
f9b0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
f9c0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
f9d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
f9e0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
f9f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fa00: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
fa10: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
fa20: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
fa30: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
fa40: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
fa50: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
fa60: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
fa70: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
fa80: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
fa90: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
faa0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
fab0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
fac0: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
fad0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
fae0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
faf0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
fb00: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
fb10: 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
fb20: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
fb30: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74  rrno);.      got
fb40: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
fb50: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
fb60: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
fb70: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
fb80: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
fb90: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
fba0: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
fbb0: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
fbc0: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
fbd0: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
fbe0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
fbf0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
fc00: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
fc10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
fc20: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
fc30: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
fc40: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
fc50: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
fc60: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
fc70: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
fc80: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
fc90: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
fca0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
fcb0: 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
fcc0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
fcd0: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
fce0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
fcf0: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
fd00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fd10: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fd20: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
fd30: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
fd40: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
fd50: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 49  rno);.        pI
fd60: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
fd70: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
fd80: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
fd90: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
fda0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
fdb0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
fdc0: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
fdd0: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
fde0: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
fdf0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
fe00: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
fe10: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
fe20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
fe30: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
fe40: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
fe50: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
fe60: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
fe70: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
fe80: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
fe90: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
fea0: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
feb0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
fec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
fed0: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
fee0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65  e);.    }.  }..e
fef0: 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69  nd_unlock:.  uni
ff00: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
ff10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ff20: 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
ff30: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
ff40: 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
ff50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
ff60: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
ff70: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
ff80: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
ff90: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
ffa0: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
ffb0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
ffc0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
ffd0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
ffe0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
fff0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10000 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
10010 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
10020 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
10030 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
10040 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
10050 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
10060 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
10070 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
10080 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51  ileLock){.#if SQ
10090 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
100a0 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65  ZE>0.  assert( e
100b0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
100c0 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46  _LOCK || ((unixF
100d0 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63  ile *)id)->nFetc
100e0 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  hOut==0 );.#endi
100f0 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  f.  return posix
10100 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
10110 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Lock, 0);.}..#if
10120 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
10130 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
10140 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
10150 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
10160 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63  4 nByte);.static
10170 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66   void unixUnmapf
10180 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
10190 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d);.#endif../*.*
101a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
101b0 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
101c0 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
101d0 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
101e0 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
101f0 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
10200 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
10210 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
10220 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
10230 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
10240 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
10250 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
10260 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
10270 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
10280 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
10290 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
102a0 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
102b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
102c0 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
102d0 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
102e0 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
102f0 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
10300 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
10310 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
10320 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
10330 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
10340 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
10350 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
10360 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10370 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53  xFile*)id;.#if S
10380 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
10390 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61  IZE>0.  unixUnma
103a0 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65  pfile(pFile);.#e
103b0 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
103c0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
103d0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
103e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
103f0 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
10400 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
10410 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
10420 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
10430 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
10440 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
10450 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  FILE_DELETE ){. 
10460 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46       osUnlink(pF
10470 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  ile->pId->zCanon
10480 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  icalName);.    }
10490 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65  .    vxworksRele
104a0 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
104b0 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65  >pId);.    pFile
104c0 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ->pId = 0;.  }.#
104d0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
104e0 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52  ITE_UNLINK_AFTER
104f0 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46 69  _CLOSE.  if( pFi
10500 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
10510 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
10520 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  ){.    osUnlink(
10530 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
10540 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10550 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d  *(char**)&pFile-
10560 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
10570 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20  le->zPath = 0;. 
10580 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
10590 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
105a0 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
105b0 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
105c0 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
105d0 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
105e0 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
105f0 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
10600 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
10610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10620 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10630 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
10640 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
10650 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
10660 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10670 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
10680 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10690 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65  xFile *)id;.  ve
106a0 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65  rifyDbFile(pFile
106b0 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  );.  unixUnlock(
106c0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
106d0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
106e0 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65  ;..  /* unixFile
106f0 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  .pInode is alway
10700 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74  s valid here. Ot
10710 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65  herwise, a diffe
10720 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20  rent close.  ** 
10730 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f  routine (e.g. no
10740 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75  lockClose()) wou
10750 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  ld be called ins
10760 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tead..  */.  ass
10770 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
10780 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70  de->nLock>0 || p
10790 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
107a0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
107b0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46  .  if( ALWAYS(pF
107c0 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20  ile->pInode) && 
107d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
107e0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Lock ){.    /* I
107f0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
10800 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
10810 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
10820 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
10830 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65  st.    ** yet be
10840 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
10850 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
10860 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
10870 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  d the file.    *
10880 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
10890 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
108a0 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62  list.  It will b
108b0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
108c0 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77  closed .    ** w
108d0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
108e0 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
108f0 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
10900 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
10910 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
10920 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
10930 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
10940 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
10950 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
10960 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
10980 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
10990 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
109a0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
109b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
10a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
10a80 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
10a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
10ab0 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
10ac0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
10ad0 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
10ae0 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
10af0 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
10b00 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
10b10 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
10b20 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
10b30 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
10b40 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
10b50 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
10b60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
10b70 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
10b80 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
10b90 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
10ba0 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
10bb0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
10bc0 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
10bd0 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
10be0 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
10bf0 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
10c00 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
10c10 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
10c20 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
10c30 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
10c40 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
10c50 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
10c60 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
10c70 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
10c80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
10c90 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
10ca0 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
10cb0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
10cc0 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
10cd0 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
10ce0 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
10cf0 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
10d00 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10d10 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
10d20 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
10d30 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
10d40 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
10d50 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
10d60 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
10d70 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
10d80 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
10d90 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
10da0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
10db0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10dc0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
10dd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10de0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
10df0 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
10e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10e10 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
10e20 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
10e30 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
10e40 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
10e50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10e60 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
10e70 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
10e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
10e90 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
10ea0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
10eb0 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
10ec0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
10ed0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
10ee0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
10ef0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10f00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10f10 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
10f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
10f30 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
10f40 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
10f50 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
10f60 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a  File(id);.}../**
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d  * End of the no-
10f90 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  op lock implemen
10fa0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11070 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f  ******* Begin do
11080 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a  t-file Locking *
11090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
110b0 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20  .** The dotfile 
110c0 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
110d0 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  tation uses the 
110e0 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70  existence of sep
110f0 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69  arate lock.** fi
11100 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69  les (really a di
11110 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74  rectory) to cont
11120 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
11130 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
11140 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75  s works.** on ju
11150 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  st about every f
11160 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
11170 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
11180 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
11190 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
111a0 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
111b0 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
111c0 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
111d0 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
111e0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
111f0 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
11200 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
11210 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
11220 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
11230 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
11240 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
11250 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
11260 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
11270 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
11280 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
11290 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
112a0 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
112b0 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
112c0 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
112d0 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
112e0 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
112f0 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
11300 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
11310 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
11320 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
11330 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
11340 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72  ng a subdirector
11350 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  y in the same di
11360 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
11370 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77  e database and w
11380 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
11390 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c  e but with a ".l
113a0 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61  ock" extension a
113b0 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69  dded..** The exi
113c0 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b  stence of a lock
113d0 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69   directory impli
113e0 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
113f0 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
11400 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28  .** lock types (
11410 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
11420 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
11430 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
11440 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
11450 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
11460 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
11470 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
11480 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
11490 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64  te the.** lock d
114a0 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65  irectory..*/.#de
114b0 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
114c0 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
114d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
114e0 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
114f0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
11500 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
11510 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
11520 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
11530 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
11540 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
11550 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
11560 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
11570 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
11580 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
11590 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
115a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
115b0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
115c0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
115d0 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
115e0 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
115f0 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
11600 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11610 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
11620 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
11630 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
11640 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
11650 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
11660 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
11670 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
11680 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
11690 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
116a0 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
116b0 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
116c0 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
116d0 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
116e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
116f0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11700 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
11710 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11720 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11730 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11740 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11750 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
11760 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
11770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11780 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
11790 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
117a0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
117b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
117c0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
117d0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
117e0 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
117f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
11800 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
11810 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
11820 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
11830 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
11840 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
11850 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
11860 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
11870 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
11880 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
11890 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
118a0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
118b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
118c0 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
118d0 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
118e0 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
118f0 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
11900 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11910 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
11920 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
11930 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
11940 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c  ed = osAccess(zL
11950 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a  ockFile, 0)==0;.
11960 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
11970 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11980 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
11990 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
119a0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
119b0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
119c0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
119d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
119e0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
119f0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
11a00 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
11a10 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
11a20 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11a30 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
11a40 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
11a50 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
11a60 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
11a70 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
11a80 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
11a90 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
11aa0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
11ab0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
11ac0 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
11ad0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
11ae0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
11af0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
11b00 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
11b10 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
11b20 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
11b30 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
11b40 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
11b50 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
11b60 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
11b70 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
11b80 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
11b90 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
11ba0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
11bb0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
11bc0 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
11bd0 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
11be0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
11bf0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
11c00 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
11c10 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
11c20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
11c30 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
11c40 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
11c50 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11c60 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11c70 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
11c80 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
11c90 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
11ca0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
11cb0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
11cc0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
11cd0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
11ce0 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
11cf0 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
11d00 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11d10 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
11d20 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
11d30 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
11d40 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
11d50 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
11d60 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
11d70 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
11d80 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
11d90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11da0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
11db0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11dc0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11dd0 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
11de0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
11df0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11e00 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
11e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
11e20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
11e30 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
11e40 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
11e50 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
11e60 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
11e70 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
11e80 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
11e90 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
11ea0 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
11eb0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11ec0 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
11ed0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11ee0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11ef0 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
11f00 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
11f10 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
11f20 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
11f30 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
11f40 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
11f50 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
11f60 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
11f70 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
11f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11f90 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11fa0 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
11fb0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
11fc0 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
11fd0 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
11fe0 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
11ff0 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
12000 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
12010 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
12020 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12030 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
12040 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
12050 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12060 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
12070 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
12080 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12090 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
120a0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
120b0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
120c0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
120d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
120e0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
120f0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
12100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
12110 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20  turn rc;.  } .  
12120 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
12130 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
12140 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
12150 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
12160 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
12170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12180 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
12190 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
121a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
121b0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
121c0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
121d0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
121e0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
121f0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12200 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12210 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12220 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
12230 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
12240 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
12250 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
12260 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12270 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68   no-op..**.** Wh
12280 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  en the locking l
12290 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f  evel reaches NO_
122a0 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65  LOCK, delete the
122b0 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73   lock file..*/.s
122c0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
122d0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
122e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
122f0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
12300 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12310 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
12320 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
12330 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
12340 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
12350 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
12360 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
12370 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
12380 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
12390 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29  pid=%d (dotlock)
123a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
123b0 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
123c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
123d0 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
123e0 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
123f0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
12400 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
12410 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12420 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
12430 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
12440 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
12450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12460 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
12470 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
12480 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
12490 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
124a0 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
124b0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
124c0 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
124d0 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
124e0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
124f0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
12500 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
12510 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12520 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
12530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12540 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
12550 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
12560 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
12570 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
12580 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
12590 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
125a0 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73  OCK );.  rc = os
125b0 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29  Rmdir(zLockFile)
125c0 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20  ;.  if( rc<0 && 
125d0 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29  errno==ENOTDIR )
125e0 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a   rc = osUnlink(z
125f0 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
12600 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   rc<0 ){.    int
12610 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12620 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
12630 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74   if( ENOENT != t
12640 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
12650 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
12660 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  _UNLOCK;.    }. 
12670 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12680 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
12690 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
126a0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
126b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
126c0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
126d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
126e0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
126f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12700 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
12710 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
12720 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
12730 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
12740 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
12750 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
12760 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
12770 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
12780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12790 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
127a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
127b0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
127c0 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63      dotlockUnloc
127d0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
127e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
127f0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
12800 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20  ontext);.    rc 
12810 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
12820 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
12830 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
12850 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
12860 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
12870 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
12880 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128d0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
128e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12920 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12940 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
12950 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
12960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12970 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
12980 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
12990 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
129a0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
129b0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
129c0 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
129d0 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
129e0 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
129f0 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
12a00 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
12a10 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
12a20 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
12a30 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
12a40 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
12a50 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
12a60 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
12a70 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
12a80 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
12a90 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
12aa0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12ab0 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
12ac0 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
12ad0 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
12ae0 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
12af0 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
12b00 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
12b10 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
12b20 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
12b30 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
12b40 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
12b50 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
12b60 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12b70 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
12b80 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.*/.#if SQLITE_
12b90 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12ba0 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  TYLE../*.** Retr
12bb0 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
12bc0 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
12bd0 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
12be0 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
12bf0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
12c00 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
12c10 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
12c20 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
12c30 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
12c40 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
12c50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12c60 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
12c70 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
12c80 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
12c90 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
12ca0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
12cb0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
12cc0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
12cd0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
12ce0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
12cf0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
12d00 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
12d10 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
12d20 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
12d30 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
12d40 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
12d50 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
12d60 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
12d70 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
12d80 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
12d90 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
12da0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
12db0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
12dc0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
12dd0 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
12de0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
12df0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12e00 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
12e10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12e20 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
12e30 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
12e40 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12e50 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
12e60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
12e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12e80 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
12e90 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
12ea0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12eb0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12ec0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
12ed0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12ee0 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12ef0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12f00 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
12f10 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12f20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12f30 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12f40 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12f50 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12f60 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12f70 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
12f80 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
12f90 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
12fa0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
12fb0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12fc0 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
12fd0 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
12fe0 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
12ff0 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
13000 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
13010 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
13020 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
13030 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
13040 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
13050 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
13060 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
13070 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
13080 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
13090 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    lrc = SQLITE_I
130a0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
130b0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
130c0 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
130d0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
130e0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
130f0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
13100 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
13110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13120 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
13130 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
13140 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
13150 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
13160 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
13170 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
13180 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
13190 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
131a0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
131b0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
131c0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
131d0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
131e0 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
131f0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
13200 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
13210 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
13220 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
13230 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
13240 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
13250 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
13260 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13270 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
13280 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
13290 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
132a0 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
132b0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
132c0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
132d0 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
132e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
132f0 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
13300 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
13310 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13320 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
13330 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
13340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13350 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
13360 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
13370 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
13380 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
13390 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
133a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
133b0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
133c0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
133d0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
133e0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
133f0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
13400 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
13410 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
13420 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
13430 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
13440 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
13450 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
13460 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
13470 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
13480 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
13490 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
134a0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
134b0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
134c0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
134d0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
134e0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
134f0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
13500 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
13510 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
13520 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
13530 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
13540 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
13550 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13560 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
13570 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
13580 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13590 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
135a0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
135b0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
135c0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
135d0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
135e0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
135f0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
13600 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  IVE.**.** flock(
13610 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  ) only really su
13620 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
13630 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
13640 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
13650 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
13660 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
13670 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
13680 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
13690 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
136a0 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
136b0 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
136c0 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
136d0 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
136e0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
136f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13700 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
13710 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
13720 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
13730 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
13740 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
13750 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
13760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13770 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
13780 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
13790 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
137a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
137b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
137c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
137d0 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
137e0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
137f0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
13800 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
13810 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
13820 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
13830 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
13840 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
13850 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
13860 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
13870 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13880 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
13890 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
138a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
138b0 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
138c0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
138d0 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66   .  if (robust_f
138e0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
138f0 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
13900 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
13910 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
13920 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
13930 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
13940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
13950 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13960 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
13970 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
13980 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13990 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
139a0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
139b0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
139c0 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
139d0 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
139e0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
139f0 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
13a00 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13a10 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13a20 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13a30 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
13a40 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
13a50 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
13a60 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
13a70 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
13a80 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
13a90 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69  : "failed"));.#i
13aa0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
13ab0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13ac0 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
13ad0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
13ae0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
13af0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13b00 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
13b10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
13b20 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13b30 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
13b40 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
13b50 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13b60 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
13b70 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
13b80 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
13b90 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
13ba0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
13bb0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
13bc0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
13bd0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13be0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
13bf0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
13c00 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
13c10 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
13c20 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
13c30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13c40 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
13c50 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
13c60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13c70 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
13c80 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
13c90 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13ca0 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
13cb0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
13cc0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
13cd0 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
13ce0 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
13cf0 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
13d00 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
13d10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13d20 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
13d30 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
13d40 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
13d50 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
13d60 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
13d70 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
13d80 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
13d90 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
13da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13db0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
13dc0 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
13dd0 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
13de0 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
13df0 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
13e00 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
13e10 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
13e20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13e30 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
13e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13e50 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
13e60 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
13e70 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
13e80 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
13e90 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
13ea0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
13eb0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13ec0 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
13ed0 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
13ee0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
13ef0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13f00 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
13f10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
13f20 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
13f30 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13f40 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
13f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13f60 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
13f70 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
13f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13f90 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
13fa0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
13fb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13fc0 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
13fd0 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
13fe0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
13ff0 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
14000 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
14010 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
14020 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
14030 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
14040 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20  E && !OS_VXWORK 
14050 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
14060 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
14070 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69  the flock lock i
14080 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
14090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140a0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
140b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140f0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
14100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14140 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
14160 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68  gin Named Semaph
14170 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ore Locking ****
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14190 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64  ****.**.** Named
141a0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
141b0 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f  ng is only suppo
141c0 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  rted on VxWorks.
141d0 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
141e0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
141f0 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c   dot-lock and fl
14200 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72  ock in that it r
14210 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75  eally only.** su
14220 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45  pports EXCLUSIVE
14230 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20   locking.  Only 
14240 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
14250 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69   can read or wri
14260 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  te.** the databa
14270 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d  se file at a tim
14280 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  e.  This reduces
14290 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75   potential concu
142a0 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d  rrency, but.** m
142b0 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d  akes the lock im
142c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63  plementation muc
142d0 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66  h easier..*/.#if
142e0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a   OS_VXWORKS../*.
142f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14300 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
14310 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
14320 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
14330 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
14340 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
14350 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
14360 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
14370 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
14380 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
14390 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
143a0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
143b0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
143c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
143d0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
143e0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
143f0 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
14400 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
14410 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
14420 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52  c int semXCheckR
14430 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
14440 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14450 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
14460 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14470 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
14480 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
14490 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
144a0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
144b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
144c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
144d0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
144e0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
144f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
14500 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
14510 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
14520 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
14530 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
14540 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
14550 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
14560 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
14570 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
14580 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
14590 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
145a0 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
145b0 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
145c0 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70   ){.    sem_t *p
145d0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
145e0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20  ode->pSem;..    
145f0 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
14600 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
14610 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
14620 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
14630 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e   EAGAIN != tErrn
14640 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
14650 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14660 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14670 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
14680 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
14690 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  CK);.        sto
146a0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
146b0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
146c0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
146d0 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
146e0 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
146f0 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e  when we are in N
14700 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20  O_LOCK */.      
14710 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46    reserved = (pF
14720 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
14730 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
14740 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14750 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f  {.      /* we co
14760 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77  uld have it if w
14770 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20  e want it */.   
14780 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d     sem_post(pSem
14790 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
147a0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
147b0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
147c0 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
147d0 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
147e0 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
147f0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
14800 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14810 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
14820 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
14830 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
14840 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
14850 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
14860 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
14870 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
14880 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
14890 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
148a0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
148b0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
148c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
148d0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
148e0 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
148f0 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
14900 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
14910 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
14920 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
14930 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
14940 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
14950 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
14960 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
14970 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
14980 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
14990 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
149a0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
149b0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
149c0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
149d0 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
149e0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
149f0 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
14a00 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
14a10 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
14a20 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
14a30 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
14a40 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
14a50 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14a60 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
14a70 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
14a80 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
14a90 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14aa0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
14ab0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14ac0 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
14ad0 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  cks only really 
14ae0 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
14af0 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
14b00 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
14b10 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
14b20 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
14b30 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
14b40 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
14b50 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
14b60 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
14b70 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
14b80 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
14b90 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
14ba0 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
14bb0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
14bc0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
14bd0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
14be0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
14bf0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
14c00 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
14c10 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
14c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
14c30 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  emXLock(sqlite3_
14c40 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
14c50 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
14c60 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14c70 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
14c80 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
14c90 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
14ca0 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  m;.  int rc = SQ
14cb0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69  LITE_OK;..  /* i
14cc0 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
14cd0 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
14ce0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
14cf0 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
14d00 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
14d10 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
14d20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
14d30 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
14d40 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
14d50 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14d60 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ock;.    rc = SQ
14d70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
14d80 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
14d90 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
14da0 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
14db0 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
14dc0 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
14dd0 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
14de0 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
14df0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14e00 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
14e10 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
14e20 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
14e30 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
14e40 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
14e50 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14e60 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
14e70 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a  . sem_end_lock:.
14e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14e90 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
14ea0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
14eb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14ec0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
14ed0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
14ee0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
14ef0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
14f00 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
14f10 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
14f20 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
14f30 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
14f40 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
14f50 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
14f60 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
14f70 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
14f80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
14f90 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e  tatic int semXUn
14fa0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
14fb0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14fc0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
14fd0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14fe0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
14ff0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
15000 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
15010 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
15030 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
15040 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
15050 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
15060 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
15070 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
15080 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
15090 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
150a0 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
150b0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
150c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
150d0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
150e0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
150f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15100 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
15110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15120 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
15130 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
15140 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
15150 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
15160 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
15170 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if (eFileLock==
15180 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
15190 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
151a0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
151b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
151c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
151d0 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e  /* no, really un
151e0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20  lock. */.  if ( 
151f0 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d  sem_post(pSem)==
15200 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
15210 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  c, tErrno = errn
15220 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  o;.    rc = sqli
15230 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
15240 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
15250 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
15260 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
15270 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
15280 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
15290 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
152a0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
152b0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
152c0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
152d0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
152e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
152f0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
15300 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
15310 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f  atic int semXClo
15320 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
15330 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
15340 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
15350 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15360 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58  le*)id;.    semX
15370 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
15380 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
15390 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
153a0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
153b0 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
153c0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
153d0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
153e0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
153f0 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
15400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15410 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
15420 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
15430 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
15440 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
15450 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
15460 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
15470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
15480 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
15490 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
154a0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
154c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
15510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
15560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15570 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
15580 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
15590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
155b0 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
155c0 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
155d0 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
155e0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
155f0 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
15600 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
15610 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
15620 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
15630 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
15640 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
15650 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
15660 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
15670 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
15680 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
15690 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
156a0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
156b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
156c0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
156d0 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
156e0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
156f0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
15700 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
15710 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
15720 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
15730 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
15740 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
15750 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
15760 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
15770 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
15780 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
15790 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
157a0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
157b0 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
157c0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
157d0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
157e0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
157f0 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
15800 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
15810 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
15820 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
15830 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
15840 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
15850 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
15860 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
15870 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
15880 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
15890 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
158a0 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
158b0 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
158c0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
158d0 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
158e0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
158f0 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
15900 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
15910 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
15920 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
15930 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
15960 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
15970 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
15980 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
15990 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
159a0 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
159b0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
159c0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
159d0 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
159e0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
159f0 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
15a00 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
15a10 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
15a20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
15a30 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
15a40 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
15a50 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
15a60 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
15a70 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
15a80 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
15a90 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
15aa0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
15ab0 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
15ac0 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
15ad0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
15ae0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
15af0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
15b00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15b10 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
15b20 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15b30 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
15b40 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
15b50 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
15b60 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
15b70 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
15b80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
15b90 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
15ba0 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
15bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15bc0 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
15bd0 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
15be0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
15bf0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
15c00 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
15c10 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
15c20 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
15c30 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
15c40 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
15c50 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
15c60 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
15c70 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
15c80 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
15c90 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
15ca0 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
15cb0 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
15cc0 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
15cd0 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
15ce0 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
15cf0 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
15d00 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
15d10 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
15d20 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
15d30 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
15d40 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
15d50 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
15d60 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
15d70 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
15d80 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
15d90 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15da0 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
15db0 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
15dc0 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
15dd0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
15de0 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
15df0 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
15e00 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
15e10 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
15e20 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
15e30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
15e40 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
15e50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
15e60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
15e70 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
15e80 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
15e90 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
15ea0 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
15eb0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
15ec0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15ed0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
15ee0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
15ef0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15f00 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74  (rc) ){.      st
15f10 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
15f20 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
15f30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
15f40 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
15f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15f60 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
15f70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
15f80 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
15f90 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
15fa0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
15fb0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
15fc0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
15fd0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
15fe0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
15ff0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
16000 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
16010 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
16020 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
16030 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
16040 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
16050 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
16060 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
16070 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
16080 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
16090 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
160a0 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  nt afpCheckReser
160b0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
160c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
160d0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
160e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
160f0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
16100 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
16110 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16120 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  *)id;.  afpLocki
16130 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
16140 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  xt;.  .  Simulat
16150 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
16160 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
16170 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
16180 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
16190 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74   pFile );.  cont
161a0 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
161b0 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
161c0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
161d0 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74  t;.  if( context
161e0 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
161f0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a    *pResOut = 1;.
16200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16210 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
16220 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
16230 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
16240 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
16250 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
16260 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  */.  .  /* Check
16270 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
16280 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
16290 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
162a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
162b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
162c0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
162d0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
162e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
162f0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
16300 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
16310 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
16320 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
16330 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
16340 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
16350 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
16360 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16370 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16380 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
16390 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
163a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
163b0 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
163c0 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
163d0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
163e0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
163f0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
16400 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
16410 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
16420 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
16430 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16440 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16450 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
16460 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
16470 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
16480 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
16490 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
164a0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
164b0 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
164c0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
164d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
164e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
164f0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
16500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
16510 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16520 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
16530 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
16540 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d %d (afp)\n", p
16550 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
16560 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70  erved));.  .  *p
16570 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
16580 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
16590 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
165a0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
165b0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
165c0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
165d0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
165e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
165f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
16600 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
16610 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
16620 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
16630 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
16640 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
16650 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
16660 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
16670 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
16680 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
16690 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
166a0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
166b0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
166c0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
166d0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
166e0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
166f0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
16700 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
16710 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
16720 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
16730 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
16740 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
16750 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
16760 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
16770 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
16780 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
16790 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
167a0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
167b0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
167c0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
167d0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
167e0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
167f0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
16800 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
16810 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
16820 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
16830 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
16840 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
16850 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
16860 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
16870 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
16880 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
16890 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
168a0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
168b0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
168c0 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
168d0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
168e0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  eFileLock){.  in
168f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16900 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
16910 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
16920 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
16930 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
16940 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
16950 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16960 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
16970 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16980 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
16990 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
169a0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
169b0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
169c0 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
169d0 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
169e0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
169f0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
16a00 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
16a10 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ck), azFileLock(
16a20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16a30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
16a40 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d  FileLock(pInode-
16a50 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e  >eFileLock), pIn
16a60 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f  ode->nShared , o
16a70 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
16a80 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
16a90 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
16aa0 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
16ab0 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
16ac0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
16ad0 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
16ae0 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
16af0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
16b00 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
16b10 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16b20 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
16b30 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
16b40 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
16b50 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
16b60 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
16b70 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
16b80 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
16b90 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  ) (afp)\n", pFil
16ba0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
16bb0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
16bc0 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
16bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16be0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
16bf0 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
16c00 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
16c10 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ect.  **  (1) We
16c20 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
16c30 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
16c40 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
16c50 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
16c60 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
16c70 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
16c80 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
16c90 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
16ca0 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
16cb0 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
16cc0 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
16cd0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
16ce0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16cf0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16d00 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
16d10 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16d20 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16d30 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
16d40 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
16d50 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
16d60 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
16d70 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
16d80 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16d90 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
16da0 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
16db0 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
16dc0 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
16dd0 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
16de0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
16df0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
16e00 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
16e10 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
16e20 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
16e30 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
16e40 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
16e50 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
16e60 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
16e70 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
16e80 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
16e90 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
16ea0 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
16eb0 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
16ec0 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
16ed0 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
16ee0 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
16ef0 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
16f00 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
16f10 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20      ){.    rc = 
16f20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16f30 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16f40 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
16f50 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
16f60 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
16f70 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
16f80 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
16f90 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
16fa0 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
16fb0 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
16fc0 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
16fd0 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
16fe0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
16ff0 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
17000 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
17010 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
17020 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
17030 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
17040 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
17050 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
17060 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
17070 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
17080 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
17090 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
170a0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
170b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
170c0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
170d0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
170e0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
170f0 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
17100 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
17110 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
17120 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
17130 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20  nd_lock;.  }.   
17140 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47   .  /* A PENDING
17150 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
17160 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
17170 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
17180 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
17190 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
171a0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
171b0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
171c0 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
171d0 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
171e0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
171f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
17200 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
17210 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
17220 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
17230 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
17240 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
17250 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  ){.    int faile
17260 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  d;.    failed = 
17270 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17280 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17290 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
172a0 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28   1, 1);.    if (
172b0 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
172c0 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
172d0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
172e0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
172f0 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72    .  /* If contr
17300 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
17310 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
17320 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
17330 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
17340 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
17350 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
17360 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
17370 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
17380 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
17390 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72      int lrc1, lr
173a0 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20  c2, lrc1Errno = 
173b0 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20  0;.    long lk, 
173c0 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61  mask;.    .    a
173d0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
173e0 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  Shared==0 );.   
173f0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
17400 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
17410 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61  .        .    ma
17420 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e  sk = (sizeof(lon
17430 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54  g)==8) ? LARGEST
17440 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66  _INT64 : 0x7ffff
17450 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  fff;.    /* Now 
17460 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
17470 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  k SHARED_LOCK */
17480 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61  .    /* note tha
17490 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66  t the quality of
174a0 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
174b0 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74  doesn't matter t
174c0 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20  hat much */.    
174d0 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a  lk = random(); .
174e0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
174f0 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d  edByte = (lk & m
17500 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a  ask)%(SHARED_SIZ
17510 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31  E - 1);.    lrc1
17520 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17530 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17540 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
17550 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
17560 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17570 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  , 1, 1);.    if(
17580 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
17590 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72  rc1) ){.      lr
175a0 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d  c1Errno = pFile-
175b0 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
175c0 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
175d0 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
175e0 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
175f0 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc2 = afpSetLoc
17600 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17610 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
17620 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
17630 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c     .    if( IS_L
17640 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
17650 29 20 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  ) {.      storeL
17660 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
17670 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20  lrc1Errno);.    
17680 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
17690 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
176a0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
176b0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
176c0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
176d0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
176e0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
176f0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
17700 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
17710 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
17720 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
17730 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
17740 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17750 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
17760 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
17770 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
17780 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
17790 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
177a0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
177b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
177c0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
177d0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
177e0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
177f0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
17800 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
17810 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
17820 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
17830 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
17840 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
17850 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
17860 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
17870 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
17880 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
17890 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
178a0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
178b0 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
178c0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
178d0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
178e0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
178f0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
17900 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
17910 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
17920 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
17930 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
17940 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
17950 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
17960 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
17970 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
17980 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
17990 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
179a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
179b0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
179c0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
179d0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
179e0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
179f0 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
17a00 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
17a10 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
17a20 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
17a30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17a40 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
17a50 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
17a60 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
17a70 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
17a80 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
17a90 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
17aa0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
17ab0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
17ac0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
17ad0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
17ae0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
17af0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
17b00 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
17b10 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
17b20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
17b30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
17b40 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
17b50 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17b60 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
17b70 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b90 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
17ba0 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
17bb0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
17bc0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
17bd0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
17be0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
17bf0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
17c00 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
17c10 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
17c20 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17c30 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17c40 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
17c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
17c90 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
17ca0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17cb0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17cc0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
17ce0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
17cf0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
17d00 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
17d10 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
17d20 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
17d30 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
17d40 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
17d50 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
17d60 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
17d70 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
17d80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
17d90 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
17da0 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
17db0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
17dc0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
17dd0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17de0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
17df0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
17e00 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
17e10 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
17e20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
17e30 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
17e40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
17e50 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
17e60 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
17e70 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
17e80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17e90 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17ea0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
17eb0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
17ec0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
17ed0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
17ee0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
17ef0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
17f00 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17f10 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
17f20 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
17f30 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
17f40 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
17f50 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
17f60 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
17f70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
17f80 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
17f90 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
17fa0 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
17fb0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
17fc0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
17fd0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
17fe0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
17ff0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
18000 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
18010 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
18020 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
18030 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
18040 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
18050 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
18060 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
18070 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
18080 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
18090 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
180a0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
180b0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
180c0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
180d0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
180e0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
180f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18100 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
18110 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
18120 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
18130 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18140 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
18150 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18160 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
18170 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
18180 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
18190 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
181a0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
181b0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
181c0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
181d0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
181e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
181f0 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
18200 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
18210 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
18220 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
18230 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
18240 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
18250 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
18260 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
18270 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
18280 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
18290 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
182a0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
182b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
182c0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
182d0 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
182e0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
182f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18300 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18310 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
18320 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18340 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
18350 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
18360 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
18370 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
18380 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
18390 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
183a0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
183b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
183c0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
183d0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
183e0 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
183f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
18400 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
18410 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
18420 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18430 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18440 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
18450 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
18460 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
18470 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
18480 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
18490 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
184a0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
184b0 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
184c0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
184d0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
184e0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
184f0 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
18500 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
18510 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
18520 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
18530 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18540 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
18550 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
18560 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
18570 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
18580 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
18590 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
185a0 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
185b0 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
185c0 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
185d0 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
185e0 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
185f0 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
18600 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
18610 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
18620 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
18630 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
18640 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
18650 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
18660 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
18670 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
18680 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
18690 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
186a0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
186b0 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
186c0 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
186d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
186e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
186f0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18700 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18710 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
18720 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
18730 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
18740 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18750 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
18760 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18770 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
18780 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
18790 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
187a0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
187b0 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
187c0 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
187d0 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
187e0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
187f0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18800 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
18810 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18820 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18830 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
18840 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
18850 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
18860 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
18870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18880 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18890 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
188a0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
188b0 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
188c0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
188d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
188e0 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
188f0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
18900 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
18910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
18920 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
18930 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
18940 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
18950 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
18960 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18970 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18980 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
18990 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
189a0 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
189b0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
189c0 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
189d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
189e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
189f0 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
18a00 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
18a10 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
18a20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
18a30 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
18a40 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
18a50 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
18a60 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
18a70 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
18a80 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
18a90 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
18aa0 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
18ab0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
18ac0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
18ad0 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
18ae0 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
18af0 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
18b00 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
18b10 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
18b20 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
18b30 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
18b40 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
18b50 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
18b60 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
18b70 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
18b80 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
18b90 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
18ba0 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
18bb0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18bc0 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
18bd0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
18be0 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
18bf0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18c00 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
18c10 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
18c20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18c30 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18c40 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
18c50 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
18c60 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
18c70 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
18c80 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
18c90 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
18ca0 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
18cb0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
18cc0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
18cd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18cf0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
18d00 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
18d10 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
18d20 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
18d30 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
18d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
18d50 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
18d60 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
18d70 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
18d80 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
18d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18da0 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
18db0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
18dc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18dd0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
18de0 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
18df0 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
18e00 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
18e10 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c  static int afpCl
18e20 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
18e30 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
18e40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18e50 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
18e60 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
18e70 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
18e80 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c     afpUnlock(id,
18e90 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
18ea0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
18eb0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
18ec0 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d  pInode && pFile-
18ed0 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
18ee0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
18ef0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
18f00 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
18f10 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
18f20 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
18f30 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
18f40 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
18f50 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
18f60 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
18f70 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
18f80 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
18f90 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67  pInode->aPending
18fa0 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
18fb0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
18fc0 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
18fd0 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
18fe0 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
18ff0 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
19000 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
19010 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
19020 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
19030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
19040 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
19050 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
19060 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
19070 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
19080 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
19090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
190a0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
190b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
190c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
190d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
190e0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
190f0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
19100 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
19110 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
19120 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
19130 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
19140 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
19150 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
19160 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
19170 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
19180 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
19190 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
191a0 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
191b0 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
191c0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
191d0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
191e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
191f0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
19200 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
19210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19220 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
19230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19270 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
19280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
192d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192e0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
192f0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
19300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19310 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
19320 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
19330 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
19340 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
19350 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
19360 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
19370 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
19380 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
19390 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
193a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
193b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
193c0 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
193d0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
193e0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
193f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
19400 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
19410 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
19420 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
19430 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
19440 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
19450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
19460 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
19470 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
19480 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
19490 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
194a0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
194b0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
194c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
194d0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
194e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
194f0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
19500 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
19510 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
19520 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
19530 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
19540 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
19550 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
19560 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
19570 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
19580 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
19590 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
195a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195b0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
195c0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
195d0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
195e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
195f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
19640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
19690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
196a0 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
196b0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
196c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
196e0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
196f0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
19700 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
19710 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
19720 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
19730 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
19740 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
19750 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
19760 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
19770 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
19780 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
19790 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
197a0 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
197b0 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
197c0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
197d0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
197e0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
197f0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
19800 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
19810 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
19820 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
19830 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
19840 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19850 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
19860 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
19870 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
19880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19890 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
198a0 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
198b0 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
198c0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
198d0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
198e0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
198f0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
19900 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
19910 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
19920 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
19930 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
19940 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
19950 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
19960 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
19970 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62  ** in any form b
19980 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
19990 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
199a0 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
199b0 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
199c0 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
199d0 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
199e0 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
199f0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
19a00 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
19a10 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
19a20 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
19a30 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
19a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
19a50 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
19a60 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
19a70 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
19a80 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
19a90 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
19aa0 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b    int prior = 0;
19ab0 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
19ac0 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
19ad0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
19ae0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
19af0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
19b00 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73  MER_START;.  ass
19b10 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
19b20 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
19b30 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a  ert( id->h>2 );.
19b40 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65    do{.#if define
19b50 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20  d(USE_PREAD).   
19b60 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69   got = osPread(i
19b70 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
19b80 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
19b90 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
19ba0 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66  ot = -1 );.#elif
19bb0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19bc0 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20  AD64).    got = 
19bd0 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  osPread64(id->h,
19be0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
19bf0 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
19c00 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
19c10 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  -1 );.#else.    
19c20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
19c30 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
19c40 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
19c50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19c60 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
19c70 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
19c80 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
19c90 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
19ca0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
19cb0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
19cc0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
19cd0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  errno);.      }e
19ce0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  lse{.        sto
19cf0 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69  reLastErrno((uni
19d00 78 46 69 6c 65 2a 29 69 64 2c 20 30 29 3b 0a 20  xFile*)id, 0);. 
19d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
19d20 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
19d30 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69    got = osRead(i
19d40 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
19d50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
19d60 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61   got==cnt ) brea
19d70 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30  k;.    if( got<0
19d80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
19d90 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f  rno==EINTR ){ go
19da0 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b  t = 1; continue;
19db0 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d   }.      prior =
19dc0 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   0;.      storeL
19dd0 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
19de0 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b  le*)id,  errno);
19df0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19e00 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
19e10 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
19e20 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
19e30 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
19e40 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
19e50 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
19e60 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
19e70 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
19e80 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
19e90 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
19ea0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
19eb0 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
19ec0 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
19ed0 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
19ee0 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
19ef0 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
19f00 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
19f10 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
19f20 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
19f30 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
19f40 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
19f50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
19f60 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
19f70 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
19f80 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
19f90 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
19fa0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
19fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19fc0 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
19fd0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
19fe0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
19ff0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1a000 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
1a010 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1a020 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1a030 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
1a040 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1a050 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
1a060 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a070 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
1a080 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1a090 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1a0a0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1a0b0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1a0c0 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1a0d0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1a0e0 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1a0f0 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1a100 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1a110 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1a120 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
1a130 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
1a140 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
1a150 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
1a160 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
1a170 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
1a180 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1a190 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1a1a0 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1a1b0 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1a1c0 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
1a1d0 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
1a1e0 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
1a1f0 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
1a200 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
1a210 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
1a220 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
1a230 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1a240 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1a250 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
1a260 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
1a270 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
1a280 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1a290 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1a2a0 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
1a2b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a2c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1a2d0 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
1a2e0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
1a2f0 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
1a300 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
1a310 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1a320 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43  on))[offset], nC
1a330 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
1a340 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
1a350 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
1a360 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
1a370 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1a380 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
1a390 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65  ndif..  got = se
1a3a0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
1a3b0 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1a3c0 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
1a3d0 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
1a3e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1a3f0 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
1a400 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
1a410 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1a420 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
1a430 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a440 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1a450 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1a460 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 20 20  no(pFile, 0);   
1a470 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
1a480 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
1a490 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
1a4a0 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
1a4b0 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
1a4c0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
1a4d0 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
1a4e0 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
1a4f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a500 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1a510 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
1a520 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65 6b 20  Attempt to seek 
1a530 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72 69 70  the file-descrip
1a540 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
1a550 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1a560 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20   to.** absolute 
1a570 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74 68 65  offset iOff, the
1a580 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  n attempt to wri
1a590 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
1a5a0 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42   data from.** pB
1a5b0 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61 6e 20  uf to it. If an 
1a5c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
1a5d0 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65 74 20  turn -1 and set 
1a5e0 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77  *piErrno. Otherw
1a5f0 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ise, .** return 
1a600 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65  the actual numbe
1a610 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1a620 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  en (which may be
1a630 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42   less than.** nB
1a640 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uf)..*/.static i
1a650 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  nt seekAndWriteF
1a660 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  d(.  int fd,    
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
1a690 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69 74 65  criptor to write
1a6a0 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66   to */.  i64 iOf
1a6b0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1a6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1a6d0 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
1a6e0 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20   writing at */. 
1a6f0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1a700 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1a710 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1a720 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72 20 74  om this buffer t
1a730 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
1a740 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20  int nBuf,       
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
1a770 72 20 70 42 75 66 20 69 6e 20 62 79 74 65 73 20  r pBuf in bytes 
1a780 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72 72 6e  */.  int *piErrn
1a790 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
1a7a0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
1a7b0 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65 72 72  or number if err
1a7c0 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a  or occurs */.){.
1a7d0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7f0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1a800 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20 63 61  ned by system ca
1a810 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
1a820 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30 78 31   nBuf==(nBuf&0x1
1a830 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
1a840 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 6e 42 75  t( fd>2 );.  nBu
1a850 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20  f &= 0x1ffff;.  
1a860 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69  TIMER_START;..#i
1a870 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1a880 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20  EAD).  do{ rc = 
1a890 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28 66 64  (int)osPwrite(fd
1a8a0 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1a8b0 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  ff); }while( rc<
1a8c0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1a8d0 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  R );.#elif defin
1a8e0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
1a8f0 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29    do{ rc = (int)
1a900 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70  osPwrite64(fd, p
1a910 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1a920 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26  ;}while( rc<0 &&
1a930 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
1a940 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20  #else.  do{.    
1a950 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65  i64 iSeek = lsee
1a960 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b  k(fd, iOff, SEEK
1a970 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
1a980 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65  ateIOError( iSee
1a990 6b 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  k-- );..    if( 
1a9a0 69 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20  iSeek!=iOff ){. 
1a9b0 20 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f       if( piErrno
1a9c0 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69   ) *piErrno = (i
1a9d0 53 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f  Seek==-1 ? errno
1a9e0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74   : 0);.      ret
1a9f0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
1aa00 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66    rc = osWrite(f
1aa10 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, pBuf, nBuf);.
1aa20 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26    }while( rc<0 &
1aa30 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1aa40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45  ;.#endif..  TIME
1aa50 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1aa60 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1aa70 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1aa80 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c  ", fd, rc, iOff,
1aa90 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1aaa0 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26  ;..  if( rc<0 &&
1aab0 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72   piErrno ) *piEr
1aac0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72  rno = errno;.  r
1aad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1aae0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1aaf0 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
1ab00 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
1ab10 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
1ab20 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
1ab30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ab40 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1ab50 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
1ab60 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
1ab70 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1ab80 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1ab90 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
1aba0 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1abb0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1abc0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1abd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1abe0 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
1abf0 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1ac00 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
1ac10 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1ac20 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64    return seekAnd
1ac30 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f  WriteFd(id->h, o
1ac40 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74  ffset, pBuf, cnt
1ac50 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , &id->lastErrno
1ac60 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  );.}.../*.** Wri
1ac70 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
1ac80 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
1ac90 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1aca0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
1acb0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
1acc0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
1acd0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1ace0 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
1acf0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1ad00 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
1ad10 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1ad20 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1ad30 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
1ad40 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1ad50 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1ad60 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
1ad70 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
1ad80 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
1ad90 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1ada0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1adb0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1adc0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1add0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1ade0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1adf0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1ae00 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1ae10 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1ae20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1ae30 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1ae40 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
1ae50 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1ae60 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
1ae70 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
1ae80 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
1ae90 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
1aea0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1aeb0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  TE_DEBUG.  /* If
1aec0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1aed0 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1aee0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1aef0 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1af00 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1af10 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1af20 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1af30 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1af40 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
1af50 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1af60 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
1af70 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
1af80 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
1af90 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
1afa0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1afb0 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
1afc0 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
1afd0 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
1afe0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1aff0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
1b000 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
1b010 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
1b020 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1b030 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
1b040 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
1b050 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
1b060 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
1b070 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
1b080 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
1b090 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1b0a0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1b0b0 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
1b0c0 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
1b0d0 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
1b0e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b0f0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1b100 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
1b110 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
1b120 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
1b130 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
1b140 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1b150 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1b160 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
1b170 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1b180 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
1b190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b1a0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
1b1b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41  fined(SQLITE_MMA
1b1c0 50 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20  P_READWRITE) && 
1b1d0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1b1e0 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
1b1f0 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
1b200 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75   this write requ
1b210 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1b220 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1b230 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1b240 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1b250 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1b260 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1b270 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1b280 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1b290 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1b2a0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1b2b0 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
1b2c0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1b2d0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1b2e0 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20   pBuf, amt);.   
1b2f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b300 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1b310 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1b320 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1b330 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1b340 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1b350 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1b360 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1b370 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  Buf, nCopy);.   
1b380 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1b390 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1b3a0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1b3b0 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1b3c0 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1b3d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20  .  }.#endif. .  
1b3e0 77 68 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20  while( (wrote = 
1b3f0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1b400 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1b410 2c 20 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77  , amt))<amt && w
1b420 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d  rote>0 ){.    am
1b430 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1b440 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
1b450 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
1b460 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
1b470 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
1b480 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
1b490 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
1b4a0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1b4b0 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
1b4c0 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
1b4d0 20 69 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29   if( amt>wrote )
1b4e0 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
1b4f0 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
1b500 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
1b510 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
1b520 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1b530 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
1b540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b550 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1b560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f  }else{.      sto
1b570 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1b580 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20  e, 0); /* not a 
1b590 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1b5a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b5b0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1b5c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1b5d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1b5e0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1b5f0 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1b600 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
1b610 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
1b620 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
1b630 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
1b640 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
1b650 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
1b660 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
1b670 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
1b680 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1b690 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
1b6a0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1b6b0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
1b6c0 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20  /*.** We do not 
1b6d0 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f  trust systems to
1b6e0 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69   provide a worki
1b6f0 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20  ng fdatasync(). 
1b700 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68   Some do..** Oth
1b710 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62  ers do no.  To b
1b720 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20  e safe, we will 
1b730 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28  stick with the (
1b740 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29  slightly slower)
1b750 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20  .** fsync(). If 
1b760 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
1b770 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
1b780 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
1b790 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
1b7a0 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
1b7b0 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
1b7c0 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20  async=fdatasync 
1b7d0 6f 72 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53  or -DHAVE_FDATAS
1b7e0 59 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  YNC.*/.#if !defi
1b7f0 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
1b800 26 20 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e  & !HAVE_FDATASYN
1b810 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61  C.# define fdata
1b820 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69  sync fsync.#endi
1b830 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
1b840 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74  HAVE_FULLFSYNC t
1b850 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69  o 0 or 1 dependi
1b860 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
1b870 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55   not.** the F_FU
1b880 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  LLFSYNC macro is
1b890 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c   defined.  F_FUL
1b8a0 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e  LFSYNC is curren
1b8b0 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69  tly.** only avai
1b8c0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20  lable on Mac OS 
1b8d0 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75  X.  But that cou
1b8e0 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69  ld change..*/.#i
1b8f0 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
1b900 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1b910 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65  ULLFSYNC 1.#else
1b920 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1b930 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69  ULLFSYNC 0.#endi
1b940 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  f.../*.** The fs
1b950 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1b960 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1b970 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1b980 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1b990 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1b9a0 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1b9b0 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1b9c0 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1b9d0 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1b9e0 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1b9f0 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1ba00 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1ba10 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1ba20 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1ba30 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1ba40 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1ba50 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1ba60 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1ba70 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1ba80 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1ba90 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1baa0 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1bab0 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1bac0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1bad0 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1bae0 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1baf0 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1bb00 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1bb10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1bb20 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1bb30 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1bb40 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1bb50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1bb60 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1bb70 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1bb80 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1bb90 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1bba0 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1bbb0 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1bbc0 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1bbd0 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1bbe0 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1bbf0 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1bc00 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1bc10 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1bc20 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1bc30 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1bc40 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1bc50 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1bc60 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1bc70 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1bc80 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1bc90 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1bca0 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1bcb0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1bcc0 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1bcd0 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1bce0 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1bcf0 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1bd00 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1bd10 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1bd20 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1bd30 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1bd40 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1bd50 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1bd60 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1bd70 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1bd80 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1bd90 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1bda0 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1bdb0 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1bdc0 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1bdd0 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1bde0 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1bdf0 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1be00 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1be10 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1be20 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1be30 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1be40 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1be50 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1be60 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1be70 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1be80 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1be90 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1bea0 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1beb0 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1bec0 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1bed0 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1bee0 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1bef0 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1bf00 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1bf10 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1bf20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1bf30 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1bf40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1bf50 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1bf60 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1bf70 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1bf80 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1bf90 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1bfa0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1bfb0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1bfc0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1bfd0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1bfe0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1bff0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1c000 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c010 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1c020 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1c030 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1c040 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1c050 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1c060 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1c070 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1c080 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1c090 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1c0a0 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1c0b0 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1c0c0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1c0d0 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1c0e0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1c0f0 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1c100 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c110 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1c120 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1c130 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1c140 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1c150 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1c160 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1c170 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1c180 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1c190 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1c1a0 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
1c1b0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1c1c0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
1c1d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69   SQLITE_OK;.#eli
1c1e0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1c1f0 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1c200 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ){.    rc = osFc
1c210 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
1c220 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  YNC, 0);.  }else
1c230 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1c240 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1c250 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1c260 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1c270 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1c280 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1c290 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1c2a0 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1c2b0 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1c2c0 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1c2d0 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1c2e0 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1c2f0 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1c300 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1c310 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1c320 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1c330 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1c340 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1c350 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1c360 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1c370 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1c380 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1c390 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1c3a0 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1c3b0 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1c3c0 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1c3d0 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1c3e0 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1c3f0 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1c400 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1c410 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1c420 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1c430 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1c440 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1c450 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1c460 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1c470 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1c480 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1c490 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1c4a0 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1c4b0 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1c4c0 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1c4d0 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1c4e0 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1c4f0 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1c500 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1c510 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1c520 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1c530 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1c540 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1c550 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1c560 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1c570 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1c580 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1c590 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1c5a0 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1c5b0 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1c5c0 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1c5d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c5e0 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1c5f0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1c600 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1c610 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1c620 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1c630 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1c640 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1c650 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1c660 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1c670 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1c680 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c690 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1c6a0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1c6b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1c6c0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1c6d0 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1c6e0 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1c6f0 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1c700 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1c710 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1c720 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1c730 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1c740 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1c750 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1c760 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1c770 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1c780 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1c790 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1c7a0 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1c7b0 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1c7c0 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1c7d0 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1c7e0 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1c7f0 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1c800 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c810 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1c820 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1c830 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1c840 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1c850 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1c860 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1c870 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1c880 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1c890 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1c8a0 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1c8b0 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1c8c0 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1c8d0 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1c8e0 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1c8f0 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1c900 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1c910 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1c920 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1c930 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1c940 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1c950 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1c960 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1c970 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1c980 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1c990 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1c9a0 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1c9b0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1c9c0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1c9d0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1c9e0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1c9f0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1ca00 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1ca10 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1ca20 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1ca30 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1ca40 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1ca50 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1ca60 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1ca70 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1ca80 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1ca90 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1caa0 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1cab0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1cac0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1cad0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1cae0 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1caf0 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1cb00 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d   ii>1 && zDirnam
1cb10 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1cb20 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1cb30 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1cb40 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64  ] = '\0';.    fd
1cb50 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
1cb60 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1cb70 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1cb80 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
1cb90 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1cba0 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
1cbb0 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
1cbc0 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e));.    }.  }. 
1cbd0 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
1cbe0 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49  turn (fd>=0?SQLI
1cbf0 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72  TE_OK:unixLogErr
1cc00 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
1cc10 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
1cc20 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a   zDirname));.}..
1cc30 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1cc40 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
1cc50 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
1cc60 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
1cc70 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
1cc80 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e  dataOnly==0 then
1cc90 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69   both the file i
1cca0 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65  tself and its me
1ccb0 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20  tadata (file.** 
1ccc0 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d  size, access tim
1ccd0 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63  e, etc) are sync
1cce0 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79  ed.  If dataOnly
1ccf0 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  !=0 then only th
1cd00 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69  e.** file data i
1cd10 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
1cd20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f  Under Unix, also
1cd30 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1cd40 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1cd50 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  try for the file
1cd60 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
1cd70 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e  ated by fsync-in
1cd80 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  g the directory 
1cd90 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1cda0 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65  e file..** If we
1cdb0 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
1cdc0 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72  and we encounter
1cdd0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
1cde0 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  , the directory.
1cdf0 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1ce00 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
1ce10 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77  ot exist after w
1ce20 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e  e reboot.  The n
1ce30 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f  ext.** SQLite to
1ce40 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
1ce50 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
1ce60 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1ce70 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a  exists (because.
1ce80 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
1ce90 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1cea0 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72  ournal was never
1ceb0 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68   created) and th
1cec0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
1ced0 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62   will not roll b
1cee0 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c  ack - possibly l
1cef0 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  eading to databa
1cf00 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  se corruption..*
1cf10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1cf20 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  xSync(sqlite3_fi
1cf30 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
1cf40 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1cf50 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1cf60 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1cf70 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e  ..  int isDataOn
1cf80 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49  ly = (flags&SQLI
1cf90 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
1cfa0 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73  );.  int isFulls
1cfb0 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30  ync = (flags&0x0
1cfc0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1cfd0 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  FULL;..  /* Chec
1cfe0 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
1cff0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
1d000 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
1d010 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
1d020 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1d030 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
1d040 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
1d050 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1d060 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
1d070 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
1d080 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
1d090 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
1d0a0 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
1d0b0 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
1d0c0 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
1d0d0 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
1d0e0 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
1d0f0 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
1d100 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
1d110 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1d120 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20  LITE_FULL );..  
1d130 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1d140 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
1d150 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
1d160 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d  ile->h));.  rc =
1d170 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
1d180 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63  e->h, isFullsync
1d190 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20  , isDataOnly);. 
1d1a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1d1b0 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
1d1c0 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  rc ){.    storeL
1d1d0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1d1e0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75  errno);.    retu
1d1f0 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1d200 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
1d210 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22  NC, "full_fsync"
1d220 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1d230 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  .  }..  /* Also 
1d240 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63 74  fsync the direct
1d250 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
1d260 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20 44  he file if the D
1d270 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a  IRSYNC flag.  **
1d280 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20 69   is set.  This i
1d290 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63  s a one-time occ
1d2a0 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73  urrence.  Many s
1d2b0 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73  ystems (examples
1d2c0 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20  : AIX).  ** are 
1d2d0 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20  unable to fsync 
1d2e0 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20  a directory, so 
1d2f0 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e  ignore errors on
1d300 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f   the fsync..  */
1d310 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74  .  if( pFile->ct
1d320 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
1d330 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20  LE_DIRSYNC ){.  
1d340 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20    int dirfd;.   
1d350 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59   OSTRACE(("DIRSY
1d360 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c  NC %s (have_full
1d370 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e  fsync=%d fullsyn
1d380 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  c=%d)\n", pFile-
1d390 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20  >zPath,.        
1d3a0 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59      HAVE_FULLFSY
1d3b0 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29  NC, isFullsync))
1d3c0 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65  ;.    rc = osOpe
1d3d0 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65  nDirectory(pFile
1d3e0 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29  ->zPath, &dirfd)
1d3f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d400 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64  LITE_OK && dirfd
1d410 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c  >=0 ){.      ful
1d420 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30  l_fsync(dirfd, 0
1d430 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  , 0);.      robu
1d440 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
1d450 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  dirfd, __LINE__)
1d460 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d470 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
1d480 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  PEN ){.      rc 
1d490 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d4a0 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74   }.    pFile->ct
1d4b0 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58  rlFlags &= ~UNIX
1d4c0 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
1d4d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1d4e0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
1d4f0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
1d500 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
1d510 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1d520 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c  unixTruncate(sql
1d530 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1d540 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69  64 nByte){.  uni
1d550 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1d560 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
1d570 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
1d580 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
1d590 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1d5a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1d5b0 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a  RR_TRUNCATE );..
1d5c0 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
1d5d0 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
1d5e0 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
1d5f0 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
1d600 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
1d610 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
1d620 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
1d630 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
1d640 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
1d650 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
1d660 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
1d670 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
1d680 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1d690 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
1d6a0 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
1d6b0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1d6c0 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
1d6d0 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
1d6e0 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
1d6f0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
1d700 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
1d710 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f  ;.  }..  rc = ro
1d720 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1d730 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b  File->h, nByte);
1d740 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1d750 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1d760 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
1d770 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1d780 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1d790 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1d7a0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1d7b0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
1d7c0 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
1d7d0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66  _DEBUG.    /* If
1d7e0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1d7f0 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1d800 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1d810 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1d820 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f     ** doing a ho
1d830 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1d840 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
1d850 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
1d860 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e   than a.    ** n
1d870 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1d880 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e  ile) and we trun
1d890 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1d8a0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20   zero length,.  
1d8b0 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74    ** that effect
1d8c0 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68  ively updates th
1d8d0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1d8e0 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  .  This might ha
1d8f0 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ppen.    ** when
1d900 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74   restoring a dat
1d910 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1d920 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20  backup API from 
1d930 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20  a zero-length.  
1d940 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20    ** source..   
1d950 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
1d960 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1d970 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
1d980 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1d990 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a  nsCntrChng = 1;.
1d9a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69      }.#endif..#i
1d9b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1d9c0 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20  P_SIZE>0.    /* 
1d9d0 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
1d9e0 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20 74  just truncated t
1d9f0 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72  o a size smaller
1da00 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
1da10 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65  tly.    ** mappe
1da20 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65  d region, reduce
1da30 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d   the effective m
1da40 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77  apping size as w
1da50 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c  ell. SQLite will
1da60 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61 64  .    ** use read
1da70 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74  () and write() t
1da80 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65  o access data be
1da90 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20  yond this point 
1daa0 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20  from now on.  . 
1dab0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42     */.    if( nB
1dac0 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte<pFile->mmapS
1dad0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ize ){.      pFi
1dae0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e  le->mmapSize = n
1daf0 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Byte;.    }.#end
1db00 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
1db10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
1db20 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
1db30 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1db40 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
1db50 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
1db60 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
1db70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1db80 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1db90 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
1dba0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
1dbb0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
1dbc0 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69   = osFstat(((uni
1dbd0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
1dbe0 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
1dbf0 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
1dc00 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
1dc10 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1dc20 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
1dc30 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1dc40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1dc50 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a  R_FSTAT;.  }.  *
1dc60 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73  pSize = buf.st_s
1dc70 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  ize;..  /* When 
1dc80 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73  opening a zero-s
1dc90 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ize database, th
1dca0 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  e findInodeInfo(
1dcb0 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  ) procedure.  **
1dcc0 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65   writes a single
1dcd0 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20   byte into that 
1dce0 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
1dcf0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62   work around a b
1dd00 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f  ug.  ** in the O
1dd10 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79  S-X msdos filesy
1dd20 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20  stem.  In order 
1dd30 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
1dd40 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a  s with upper.  *
1dd50 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65  * layers, we nee
1dd60 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73  d to report this
1dd70 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65   file size as ze
1dd80 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  ro even though i
1dd90 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79  t is.  ** really
1dda0 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32   1.   Ticket #32
1ddb0 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a  60..  */.  if( *
1ddc0 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a  pSize==1 ) *pSiz
1ddd0 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72  e = 0;...  retur
1dde0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ddf0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1de00 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1de10 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1de20 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  LE__)./*.** Hand
1de30 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f  ler for proxy-lo
1de40 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72  cking file-contr
1de50 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e  ol verbs.  Defin
1de60 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a  ed below in the.
1de70 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  ** proxying lock
1de80 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  ing division..*/
1de90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1dea0 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
1deb0 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
1dec0 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  oid*);.#endif../
1ded0 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
1dee0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1def0 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49   handle the SQLI
1df00 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1df10 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74  NT .** file-cont
1df20 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  rol operation.  
1df30 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74 61  Enlarge the data
1df40 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69  base to nBytes i
1df50 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64  n size.** (round
1df60 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78  ed up to the nex
1df70 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20  t chunk-size).  
1df80 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1df90 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42  is already.** nB
1dfa0 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20  ytes or larger, 
1dfb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1dfc0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1dfd0 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65  ic int fcntlSize
1dfe0 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  Hint(unixFile *p
1dff0 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29  File, i64 nByte)
1e000 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  {.  if( pFile->s
1e010 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
1e020 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  i64 nSize;      
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e040 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   Required file s
1e050 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
1e060 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20 20  t stat buf;     
1e070 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1e080 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20   to hold return 
1e090 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28  values of fstat(
1e0a0 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28  ) */.   .    if(
1e0b0 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
1e0c0 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
1e0d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e0e0 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
1e0f0 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   }..    nSize = 
1e100 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73  ((nByte+pFile->s
1e110 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c  zChunk-1) / pFil
1e120 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1e130 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1e140 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34    if( nSize>(i64
1e150 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a  )buf.st_size ){.
1e160 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
1e170 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1e180 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
1e190 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20  _FALLOCATE.     
1e1a0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c   /* The code bel
1e1b0 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74  ow is handling t
1e1c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1e1d0 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29  of osFallocate()
1e1e0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65   .      ** corre
1e1f0 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c  ctly. posix_fall
1e200 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e  ocate() is defin
1e210 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a  ed to "returns z
1e220 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
1e230 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20  .      ** or an 
1e240 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20  error number on 
1e250 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74   failure". See t
1e260 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64  he manpage for d
1e270 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1e280 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20   int err;.      
1e290 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20  do{.        err 
1e2a0 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46  = osFallocate(pF
1e2b0 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73  ile->h, buf.st_s
1e2c0 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73  ize, nSize-buf.s
1e2d0 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  t_size);.      }
1e2e0 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54  while( err==EINT
1e2f0 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  R );.      if( e
1e300 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rr ) return SQLI
1e310 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1e320 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49  #else.      /* I
1e330 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f  f the OS does no
1e340 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c  t have posix_fal
1e350 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69  locate(), fake i
1e360 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20 20  t. Write a .    
1e370 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
1e380 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74   to the last byt
1e390 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
1e3a0 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72  that falls entir
1e3b0 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ely.      ** wit
1e3c0 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64  hin the extended
1e3d0 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69   region. Then, i
1e3e0 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73 69  f required, a si
1e3f0 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20  ngle byte.      
1e400 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53  ** at offset (nS
1e410 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74  ize-1), to set t
1e420 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1e430 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ile correctly.. 
1e440 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1e450 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69  a similar techni
1e460 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65 64  que to that used
1e470 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73   by glibc on sys
1e480 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  tems.      ** th
1e490 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
1e4a0 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28   real fallocate(
1e4b0 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  ) call..      */
1e4c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
1e4d0 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
1e4e0 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
1e4f0 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
1e500 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
1e510 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e520 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1e530 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20  ytes written by 
1e540 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1e550 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
1e560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e570 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
1e580 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1e590 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20  .      iWrite = 
1e5a0 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20  ((buf.st_size + 
1e5b0 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b  2*nBlk - 1)/nBlk
1e5c0 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20  )*nBlk-1;.      
1e5d0 61 73 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d  assert( iWrite>=
1e5e0 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20  buf.st_size );. 
1e5f0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 57       assert( (iW
1e600 72 69 74 65 2f 6e 42 6c 6b 29 3d 3d 28 28 62 75  rite/nBlk)==((bu
1e610 66 2e 73 74 5f 73 69 7a 65 2b 6e 42 6c 6b 2d 31  f.st_size+nBlk-1
1e620 29 2f 6e 42 6c 6b 29 20 29 3b 0a 20 20 20 20 20  )/nBlk) );.     
1e630 20 61 73 73 65 72 74 28 20 28 28 69 57 72 69 74   assert( ((iWrit
1e640 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b  e+1)%nBlk)==0 );
1e650 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d  .      for(/*no-
1e660 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69  op*/; iWrite<nSi
1e670 7a 65 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b  ze; iWrite+=nBlk
1e680 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 57 72 69   ){.        nWri
1e690 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1e6a0 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c  e(pFile, iWrite,
1e6b0 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   "", 1);.       
1e6c0 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29   if( nWrite!=1 )
1e6d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e6e0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1e6f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57    }.      if( nW
1e700 72 69 74 65 3d 3d 30 20 7c 7c 20 28 6e 53 69 7a  rite==0 || (nSiz
1e710 65 25 6e 42 6c 6b 29 20 29 7b 0a 20 20 20 20 20  e%nBlk) ){.     
1e720 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b     nWrite = seek
1e730 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
1e740 6e 53 69 7a 65 2d 31 2c 20 22 22 2c 20 31 29 3b  nSize-1, "", 1);
1e750 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72  .        if( nWr
1e760 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20  ite!=1 ) return 
1e770 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1e780 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  TE;.      }.#end
1e790 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  if.    }.  }..#i
1e7a0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1e7b0 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
1e7c0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1e7d0 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69  x>0 && nByte>pFi
1e7e0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1e7f0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1e800 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1e810 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  nk<=0 ){.      i
1e820 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
1e830 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  ate(pFile->h, nB
1e840 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  yte) ){.        
1e850 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
1e860 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
1e870 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
1e880 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1e890 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1e8a0 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1e8b0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1e8c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e8d0 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65  rc = unixMapfile
1e8e0 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  (pFile, nByte);.
1e8f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e900 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
1e910 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e920 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
1e930 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65   is initially ne
1e940 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73  gative then this
1e950 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65   is a query.  Se
1e960 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20  t *pArg to.** 1 
1e970 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 0 depending o
1e980 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1e990 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69   bit mask of pFi
1e9a0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73  le->ctrlFlags is
1e9b0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a   set..**.** If *
1e9c0 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20  pArg is 0 or 1, 
1e9d0 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65  then clear or se
1e9e0 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f  t the mask bit o
1e9f0 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1ea00 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
1ea10 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75  id unixModeBit(u
1ea20 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1ea30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61  unsigned char ma
1ea40 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a  sk, int *pArg){.
1ea50 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b    if( *pArg<0 ){
1ea60 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46  .    *pArg = (pF
1ea70 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1ea80 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c   mask)!=0;.  }el
1ea90 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d  se if( (*pArg)==
1eaa0 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
1eab0 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61  ctrlFlags &= ~ma
1eac0 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
1ead0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1eae0 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d  s |= mask;.  }.}
1eaf0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1eb00 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
1eb10 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
1eb20 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
1eb30 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f   char *zBuf);../
1eb40 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
1eb50 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20   and control of 
1eb60 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  an open file han
1eb70 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
1eb80 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72  nt unixFileContr
1eb90 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1eba0 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
1ebb0 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78  d *pArg){.  unix
1ebc0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1ebd0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
1ebe0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1ebf0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ec00 54 4c 5f 57 41 4c 5f 42 4c 4f 43 4b 3a 20 7b 0a  TL_WAL_BLOCK: {.
1ec10 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e        /* pFile->
1ec20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
1ec30 58 46 49 4c 45 5f 42 4c 4f 43 4b 3b 20 2f 2f 20  XFILE_BLOCK; // 
1ec40 44 65 66 65 72 72 65 64 20 66 65 61 74 75 72 65  Deferred feature
1ec50 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1ec60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ec70 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1ec80 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
1ec90 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
1eca0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1ecb0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
1ecc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ecd0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1ece0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
1ecf0 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
1ed00 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1ed10 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1ed20 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
1ed30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ed40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ed50 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
1ed60 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  E: {.      pFile
1ed70 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
1ed80 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  t *)pArg;.      
1ed90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1eda0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1edb0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1edc0 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
1edd0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53   int rc;.      S
1ede0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1edf0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
1ee00 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  c = fcntlSizeHin
1ee10 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a  t(pFile, *(i64 *
1ee20 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69  )pArg);.      Si
1ee30 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1ee40 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65  ign(0);.      re
1ee50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ee60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ee70 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
1ee80 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f  : {.      unixMo
1ee90 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49  deBit(pFile, UNI
1eea0 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
1eeb0 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
1eec0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1eed0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1eee0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1eef0 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
1ef00 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
1ef10 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
1ef20 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  le, UNIXFILE_PSO
1ef30 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  W, (int*)pArg);.
1ef40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ef50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1ef60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1ef70 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20  NTL_VFSNAME: {. 
1ef80 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
1ef90 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
1efa0 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65  intf("%s", pFile
1efb0 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pVfs->zName);.
1efc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1efd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1efe0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1eff0 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
1f000 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  : {.      char *
1f010 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  zTFile = sqlite3
1f020 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69 6c 65  _malloc64( pFile
1f030 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1f040 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me );.      if( 
1f050 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  zTFile ){.      
1f060 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d    unixGetTempnam
1f070 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  e(pFile->pVfs->m
1f080 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c  xPathname, zTFil
1f090 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68  e);.        *(ch
1f0a0 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
1f0b0 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
1f0c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f0d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1f0e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f0f0 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20  HAS_MOVED: {.   
1f100 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1f110 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46   fileHasMoved(pF
1f120 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ile);.      retu
1f130 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f140 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
1f150 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1f160 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f170 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  CNTL_MMAP_SIZE: 
1f180 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c  {.      i64 newL
1f190 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41  imit = *(i64*)pA
1f1a0 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  rg;.      int rc
1f1b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f1c0 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
1f1d0 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  >sqlite3GlobalCo
1f1e0 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20  nfig.mxMmap ){. 
1f1f0 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20         newLimit 
1f200 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
1f210 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20  onfig.mxMmap;.  
1f220 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36      }.      *(i6
1f230 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  4*)pArg = pFile-
1f240 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
1f250 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
1f260 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21  >=0 && newLimit!
1f270 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  =pFile->mmapSize
1f280 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46  Max && pFile->nF
1f290 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  etchOut==0 ){.  
1f2a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1f2b0 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69  pSizeMax = newLi
1f2c0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mit;.        if(
1f2d0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1f2e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1f2f0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
1f300 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
1f310 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65  rc = unixMapfile
1f320 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20  (pFile, -1);.   
1f330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f340 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f350 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1f360 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f370 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
1f380 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
1f390 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
1f3a0 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
1f3b0 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
1f3c0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
1f3d0 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
1f3e0 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
1f3f0 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
1f400 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
1f410 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1f420 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
1f430 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
1f440 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
1f450 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f460 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
1f470 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
1f480 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
1f490 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
1f4a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f4b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1f4c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f4d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1f4e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1f4f0 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
1f500 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43  TE_FCNTL_SET_LOC
1f510 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20  KPROXYFILE:.    
1f520 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f530 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_GET_LOCKPROXYF
1f540 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ILE: {.      ret
1f550 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  urn proxyFileCon
1f560 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29  trol(id,op,pArg)
1f570 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1f580 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1f590 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1f5a0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1f5b0 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  __) */.  }.  ret
1f5c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
1f5d0 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  UND;.}../*.** Re
1f5e0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
1f5f0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
1f600 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1f610 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
1f620 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
1f630 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
1f640 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
1f650 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
1f660 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
1f670 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
1f680 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
1f690 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
1f6a0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
1f6b0 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
1f6c0 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
1f6d0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
1f6e0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
1f6f0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
1f700 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
1f710 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
1f720 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
1f730 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
1f740 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
1f750 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
1f760 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  oth..*/.#ifndef 
1f770 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74  __QNXNTO__ .stat
1f780 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f  ic int unixSecto
1f790 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1f7a0 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  le *NotUsed){.  
1f7b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1f7c0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1f7d0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
1f7e0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1f7f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1f800 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65  The following ve
1f810 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63  rsion of unixSec
1f820 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6f 70 74  torSize() is opt
1f830 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a  imized for QNX..
1f840 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  */.#ifdef __QNXN
1f850 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  TO__.#include <s
1f860 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23  ys/dcmd_blk.h>.#
1f870 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
1f880 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 69  tvfs.h>.static i
1f890 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1f8a0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1f8b0 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
1f8c0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1f8d0 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46  le*)id;.  if( pF
1f8e0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f8f0 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75  == 0 ){.    stru
1f900 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e 66  ct statvfs fsInf
1f910 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f  o;.       .    /
1f920 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20 66  * Set defaults f
1f930 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64  or non-supported
1f940 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a   filesystems */.
1f950 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f960 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1f970 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1f980 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64  ZE;.    pFile->d
1f990 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f9a0 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  tics = 0;.    if
1f9b0 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c 65  ( fstatvfs(pFile
1f9c0 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ->h, &fsInfo) ==
1f9d0 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65   -1 ) {.      re
1f9e0 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74  turn pFile->sect
1f9f0 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  orSize;.    }.. 
1fa00 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 66     if( !strcmp(f
1fa10 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1fa20 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20  , "tmp") ) {.   
1fa30 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
1fa40 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
1fa50 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
1fa60 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1fa70 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1fa80 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1fa90 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20  _ATOMIC4K |     
1faa0 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c    /* All ram fil
1fab0 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
1fac0 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
1fad0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fae0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
1faf0 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
1fb00 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1fb10 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
1fb50 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
1fb60 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fb70 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1fb80 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1fb90 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1fba0 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbd0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1fbe0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1fbf0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1fc00 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
1fc10 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66 73  _basetype, "etfs
1fc20 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
1fc30 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1fc40 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
1fc50 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1fc60 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1fc70 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
1fc80 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a  etfs cluster siz
1fc90 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  e writes are ato
1fca0 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  mic */.        (
1fcb0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1fcc0 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
1fcd0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1fce0 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  ) |.        SQLI
1fcf0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1fd00 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1fd10 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1fd20 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1fd30 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1fd60 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1fd70 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1fd80 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1fd90 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1fda0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1fdb0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1fdc0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1fdf0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1fe00 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1fe10 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
1fe20 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1fe30 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20  e, "qnx6") ){.  
1fe40 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1fe50 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1fe60 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1fe70 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1fe80 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1fe90 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fea0 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20  P_ATOMIC |      
1feb0 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79     /* All filesy
1fec0 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
1fed0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1fee0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1fef0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1ff00 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1ff10 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1ff20 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1ff50 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1ff60 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1ff70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1ff80 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1ff90 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1ffa0 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1ffb0 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1ffe0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1fff0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
20000 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
20010 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
20020 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29  asetype, "qnx4")
20030 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
20040 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
20050 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
20060 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
20070 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20080 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
20090 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
200a0 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
200b0 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
200c0 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
200d0 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
200e0 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
200f0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
20100 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
20110 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
20120 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
20130 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
20140 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
20150 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
20160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20180 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
20190 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
201a0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
201b0 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
201c0 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
201d0 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20   "dos") ){.     
201e0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
201f0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
20200 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
20210 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
20220 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
20230 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74    /* full bitset
20240 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d   of atomics from
20250 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65   max sector size
20260 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a   and smaller */.
20270 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
20280 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
20290 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
202a0 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31  _ATOMIC512) << 1
202b0 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20  ) - 2 |.        
202c0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
202d0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
202e0 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
202f0 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
20300 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20330 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
20340 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
20350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20360 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
20370 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
20380 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
20390 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c  OCAP_ATOMIC512 |
203a0 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20        /* blocks 
203b0 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
203c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
203d0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
203e0 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
203f0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
20400 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
20440 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
20450 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d      0;.    }.  }
20460 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63  .  /* Last chanc
20470 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20  e verification. 
20480 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20 73   If the sector s
20490 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74  ize isn't a mult
204a0 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a  iple of 512.  **
204b0 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76   then it isn't v
204c0 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46  alid.*/.  if( pF
204d0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
204e0 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20  % 512 != 0 ){.  
204f0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
20500 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
20510 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   0;.    pFile->s
20520 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
20530 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
20540 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65  R_SIZE;.  }.  re
20550 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74  turn pFile->sect
20560 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  orSize;.}.#endif
20570 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a   /* __QNXNTO__ *
20580 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
20590 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
205a0 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74  cteristics for t
205b0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
205c0 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75  his VFS is set u
205d0 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  p to return SQLI
205e0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
205f0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20  FE_OVERWRITE by 
20600 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65  default..** Howe
20610 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65  ver, that choice
20620 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69 61   is controversia
20630 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61  l since technica
20640 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69  lly the underlyi
20650 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  ng.** file syste
20660 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79  m does not alway
20670 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73  s provide powers
20680 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20  afe overwrites. 
20690 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f   (In other.** wo
206a0 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77  rds, after a pow
206b0 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70  er-loss event, p
206c0 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65  arts of the file
206d0 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72   that were never
206e0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68  .** written migh
206f0 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61  t end up being a
20700 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65  ltered.)  Howeve
20710 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61  r, non-PSOW beha
20720 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a  vior is very,.**
20730 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64   very rare.  And
20740 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20   asserting PSOW 
20750 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65  makes a large re
20760 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61  duction in the a
20770 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75  mount.** of requ
20780 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75  ired I/O for jou
20790 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61  rnaling, since a
207a0 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20   lot of padding 
207b0 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a  is eliminated..*
207c0 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20  *  Hence, while 
207d0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
207e0 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ITE is on by def
207f0 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61  ault, there is a
20800 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a   file-control.**
20810 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
20820 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52  rn it off and UR
20830 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  I query paramete
20840 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  r available to t
20850 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73  urn it off..*/.s
20860 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
20870 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20880 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
20890 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
208a0 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
208b0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
208c0 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58   0;.#ifdef __QNX
208d0 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73  NTO__.  if( p->s
208e0 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75  ectorSize==0 ) u
208f0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 69 64  nixSectorSize(id
20900 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65 76  );.  rc = p->dev
20910 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20920 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  cs;.#endif.  if(
20930 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20   p->ctrlFlags & 
20940 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b  UNIXFILE_PSOW ){
20950 0a 20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49 54  .    rc |= SQLIT
20960 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
20970 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 7d  E_OVERWRITE;.  }
20980 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20990 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
209a0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
209b0 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
209c0 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20  P_SIZE>0../*.** 
209d0 52 65 74 75 72 6e 20 74 68 65 20 73 79 73 74 65  Return the syste
209e0 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  m page size..**.
209f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20a00 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
20a10 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 62  alled directly b
20a20 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e 20  y other code in 
20a30 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49  this file. .** I
20a40 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75 6c  nstead, it shoul
20a50 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61 20  d be called via 
20a60 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65 73  macro osGetpages
20a70 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ize()..*/.static
20a80 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65   int unixGetpage
20a90 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20  size(void){.#if 
20aa0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74  OS_VXWORKS.  ret
20ab0 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66 20  urn 1024;.#elif 
20ac0 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55  defined(_BSD_SOU
20ad0 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65  RCE).  return ge
20ae0 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c  tpagesize();.#el
20af0 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74  se.  return (int
20b00 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47  )sysconf(_SC_PAG
20b10 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d  ESIZE);.#endif.}
20b20 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ..#endif /* !def
20b30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
20b40 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
20b50 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
20b60 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
20b70 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
20b80 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  ** Object used t
20b90 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73  o represent an s
20ba0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66  hared memory buf
20bb0 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  fer.  .**.** Whe
20bc0 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
20bd0 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
20be0 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e   the same wal-in
20bf0 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64  dex, each thread
20c00 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20  .** has its own 
20c10 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20  unixShm object, 
20c20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69  but they all poi
20c30 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
20c40 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
20c50 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
20c60 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
20c70 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c   words, each wal
20c80 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64  -index is opened
20c90 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  .** only once pe
20ca0 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
20cb0 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64   Each unixShmNod
20cc0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e  e object is conn
20cd0 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c  ected to a singl
20ce0 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
20cf0 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f  object..** We co
20d00 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69  uld coalesce thi
20d10 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e  s object into un
20d20 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74  ixInodeInfo, but
20d30 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e   that would mean
20d40 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66  .** every open f
20d50 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ile that does no
20d60 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d  t use shared mem
20d70 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ory (in other wo
20d80 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65  rds, most.** ope
20d90 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68  n files) would h
20da0 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f  ave to carry aro
20db0 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69  und this extra i
20dc0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a  nformation.  So.
20dd0 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ** the unixInode
20de0 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74  Info object cont
20df0 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
20e00 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  o this unixShmNo
20e10 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64  de object.** and
20e20 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
20e30 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
20e40 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65  ed only when nee
20e50 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d  ded..**.** unixM
20e60 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
20e70 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
20e80 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
20e90 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
20ea0 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
20eb0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
20ec0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
20ed0 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
20ee0 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nRef.**.** The f
20ef0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
20f00 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
20f10 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
20f20 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a  s created:.** .*
20f30 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
20f40 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
20f50 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68  ** Either unixSh
20f60 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74  mNode.mutex must
20f70 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78   be held or unix
20f80 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
20f90 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  and.** unixMutex
20fa0 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
20fb0 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
20fc0 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
20fd0 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
20fe0 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  s structure..*/.
20ff0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
21000 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  de {.  unixInode
21010 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
21020 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e    /* unixInodeIn
21030 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69  fo that owns thi
21040 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20  s SHM node */.  
21050 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
21060 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
21070 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
21080 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
21090 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
210a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
210b0 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64  e of the mmapped
210c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68   file */.  int h
210d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
210e0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
210f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
21100 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21120 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
21130 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
21140 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b  /.  u16 nRegion;
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21160 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
21170 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38  apRegion */.  u8
21180 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20   isReadonly;    
21190 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
211a0 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f   if read-only */
211b0 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69  .  char **apRegi
211c0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
211d0 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64   Array of mapped
211e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
211f0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
21200 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
21210 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21220 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65   of unixShm obje
21230 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
21240 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
21250 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
21260 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78       /* All unix
21270 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
21280 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
21290 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
212a0 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
212b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
212c0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
212d0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
212e0 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
212f0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
21300 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
21310 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
21320 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21340 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
21350 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
21360 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
21370 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
21380 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
21390 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
213a0 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
213b0 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
213c0 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
213d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
213e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
213f0 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
21400 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
21410 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
21420 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
21430 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
21440 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  *.**    unixShm.
21450 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78  pFile.**    unix
21460 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
21470 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
21480 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
21490 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
214a0 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
214b0 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
214c0 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
214d0 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
214e0 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
214f0 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65   {.  unixShmNode
21500 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
21510 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
21520 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  g unixShmNode ob
21530 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ject */.  unixSh
21540 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
21550 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69       /* Next uni
21560 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  xShm with the sa
21570 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  me unixShmNode *
21580 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
215a0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
215b0 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  g the unixShmNod
215c0 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20  e mutex */.  u8 
215d0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
215e0 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
215f0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
21600 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78   within its unix
21610 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36  ShmNode */.  u16
21620 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
21630 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
21640 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
21650 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
21660 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
21670 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
21680 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
21690 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  held */.};../*.*
216a0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
216b0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
216c0 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
216d0 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
216e0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
216f0 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  )         /* fir
21700 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
21710 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
21720 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48  _DMS    (UNIX_SH
21730 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
21740 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
21750 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
21760 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69  /*.** Apply posi
21770 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  x advisory locks
21780 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66   for all bytes f
21790 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68  rom ofst through
217a0 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a   ofst+n-1..**.**
217b0 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20   Locks block if 
217c0 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63  the mask is exac
217d0 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61  tly UNIX_SHM_C a
217e0 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b  nd are non-block
217f0 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ing.** otherwise
21800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21810 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
21820 6b 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  k(.  unixFile *p
21830 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f  File,       /* O
21840 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  pen connection t
21850 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a  o the WAL file *
21860 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
21870 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f  ,          /* F_
21880 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20  UNLCK, F_RDLCK, 
21890 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
218a0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
218b0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
218c0 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  byte of the lock
218d0 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69  ing range */.  i
218e0 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
218f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21900 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
21910 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
21920 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
21930 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
21940 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
21950 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
21960 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  t */.  struct fl
21970 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 20 2f 2a  ock f;        /*
21980 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   The posix advis
21990 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ory locking stru
219a0 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72  cture */.  int r
219b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
219c0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
219d0 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f   form fcntl() */
219e0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
219f0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
21a00 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
21a10 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
21a20 6c 65 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64  ler */.  pShmNod
21a30 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
21a40 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
21a50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21a60 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f  utex_held(pShmNo
21a70 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53  de->mutex) || pS
21a80 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
21a90 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20  );..  /* Shared 
21aa0 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e  locks never span
21ab0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
21ac0 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  yte */.  assert(
21ad0 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70   n==1 || lockTyp
21ae0 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20  e!=F_RDLCK );.. 
21af0 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69   /* Locks are wi
21b00 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  thin range */.  
21b10 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20  assert( n>=1 && 
21b20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  n<SQLITE_SHM_NLO
21b30 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  CK );..  if( pSh
21b40 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
21b50 20 20 20 69 6e 74 20 6c 6b 54 79 70 65 3b 0a 20     int lkType;. 
21b60 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
21b70 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
21b80 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d  ameters */.    m
21b90 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a  emset(&f, 0, siz
21ba0 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c  eof(f));.    f.l
21bb0 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65  _type = lockType
21bc0 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65  ;.    f.l_whence
21bd0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
21be0 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73   f.l_start = ofs
21bf0 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d  t;.    f.l_len =
21c00 20 6e 3b 0a 0a 20 20 20 20 6c 6b 54 79 70 65 20   n;..    lkType 
21c10 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
21c20 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 42  ags & UNIXFILE_B
21c30 4c 4f 43 4b 29 21 3d 30 20 3f 20 46 5f 53 45 54  LOCK)!=0 ? F_SET
21c40 4c 4b 57 20 3a 20 46 5f 53 45 54 4c 4b 3b 0a 20  LKW : F_SETLK;. 
21c50 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
21c60 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6c 6b 54  pShmNode->h, lkT
21c70 79 70 65 2c 20 26 66 29 3b 0a 20 20 20 20 72 63  ype, &f);.    rc
21c80 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20   = (rc!=(-1)) ? 
21c90 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
21ca0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 70 46 69  TE_BUSY;.    pFi
21cb0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
21cc0 20 7e 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b   ~UNIXFILE_BLOCK
21cd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
21ce0 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f  te the global lo
21cf0 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20  ck state and do 
21d00 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f  debug tracing */
21d10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21d20 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73  EBUG.  { u16 mas
21d30 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  k;.  OSTRACE(("S
21d40 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d  HM-LOCK "));.  m
21d50 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20  ask = ofst>31 ? 
21d60 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66  0xffff : (1<<(of
21d70 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
21d80 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
21d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
21da0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
21db0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
21dc0 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
21dd0 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
21de0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
21df0 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
21e00 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
21e10 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
21e20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  ~mask;.    }else
21e30 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
21e40 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
21e50 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
21e60 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
21e70 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
21e80 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
21e90 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
21ea0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
21eb0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
21ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
21ed0 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
21ee0 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
21ef0 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
21f00 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
21f10 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
21f20 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20  de->exclMask |= 
21f30 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
21f40 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
21f50 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
21f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
21f70 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
21f80 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
21f90 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
21fa0 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
21fb0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21fc0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
21fd0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
21fe0 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66  CE(("read-lock f
21ff0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65  ailed"));.    }e
22000 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
22010 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
22020 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
22030 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
22040 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
22050 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  fst));.    }.  }
22060 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20  .  OSTRACE((" - 
22070 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c  afterwards %03x,
22080 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
22090 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
220a0 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f  aredMask, pShmNo
220b0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a  de->exclMask));.
220c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
220d0 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20  turn rc;        
220e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
220f0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d   the minimum num
22100 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d 20  ber of 32KB shm 
22110 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68 6f  regions that sho
22120 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61 74  uld be mapped at
22130 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73 75  .** a time, assu
22140 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68 20 6d  ming that each m
22150 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 61  apping must be a
22160 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
22170 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  le of the.** cur
22180 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67 65  rent system page
22190 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75  -size..**.** Usu
221a0 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31 2e  ally, this is 1.
221b0 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 73   The exception s
221c0 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74 65  eems to be syste
221d0 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66  ms that are conf
221e0 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65  igured.** to use
221f0 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69 6e   64KB pages - in
22200 20 74 68 69 73 20 63 61 73 65 20 65 61 63 68 20   this case each 
22210 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f 76  mapping must cov
22220 65 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f 0a  er at least two.
22230 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a  ** shm regions..
22240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
22250 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
22260 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73  p(void){.  int s
22270 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20  hmsz = 32*1024; 
22280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48             /* SH
22290 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f  M region size */
222a0 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73  .  int pgsz = os
222b0 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20 20  Getpagesize();  
222c0 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65 20   /* System page 
222d0 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  size */.  assert
222e0 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73 7a  ( ((pgsz-1)&pgsz
222f0 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61 67  )==0 );   /* Pag
22300 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
22310 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20   power of 2 */. 
22320 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20   if( pgsz<shmsz 
22330 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
22340 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b  turn pgsz/shmsz;
22350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  .}../*.** Purge 
22360 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c  the unixShmNodeL
22370 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
22380 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69  entries with uni
22390 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
223a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
223b0 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
223c0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
223d0 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
223e0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
223f0 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
22400 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
22410 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22420 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69  unixShmPurge(uni
22430 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75  xFile *pFd){.  u
22440 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20  nixShmNode *p = 
22450 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  pFd->pInode->pSh
22460 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
22470 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
22480 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
22490 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
224a0 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20   int nShmPerMap 
224b0 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  = unixShmRegionP
224c0 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74  erMap();.    int
224d0 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
224e0 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
224f0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71  pInode );.    sq
22500 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
22510 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
22520 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
22530 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65  egion; i+=nShmPe
22540 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28  rMap){.      if(
22550 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
22560 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
22570 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
22580 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
22590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
225a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
225b0 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
225c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
225d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
225e0 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
225f0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
22600 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
22610 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
22620 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
22630 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
22640 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
22650 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
22660 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
22670 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
22680 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
22690 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
226a0 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
226b0 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
226c0 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
226d0 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
226e0 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
226f0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
22700 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
22710 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
22720 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
22730 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
22740 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
22750 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
22760 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
22770 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
22780 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
22790 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
227a0 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
227b0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
227c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
227d0 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
227e0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
227f0 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
22800 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
22810 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
22820 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
22830 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
22840 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
22850 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
22860 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
22870 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
22880 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
22890 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
228a0 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
228b0 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
228c0 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
228d0 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
228e0 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
228f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22900 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
22910 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
22920 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
22930 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
22940 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
22950 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
22960 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
22970 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
22980 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
22990 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
229a0 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
229b0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
229c0 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
229d0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
229e0 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
229f0 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
22a00 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
22a10 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
22a20 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
22a30 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
22a40 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
22a50 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
22a60 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
22a70 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
22a80 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
22a90 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
22aa0 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
22ab0 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
22ac0 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
22ad0 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
22ae0 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
22af0 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
22b00 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
22b10 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
22b20 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
22b30 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
22b40 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
22b50 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
22b60 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
22b70 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
22b80 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
22b90 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
22ba0 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
22bb0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
22bc0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
22bd0 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
22be0 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
22bf0 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
22c00 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
22c10 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
22c20 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
22c30 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
22c40 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
22c50 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
22c60 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
22c70 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
22c80 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
22c90 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
22ca0 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
22cb0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
22cc0 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
22cd0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
22ce0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
22cf0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
22d00 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
22d10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
22d20 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
22d30 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
22d40 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
22d50 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
22d60 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
22d70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22d80 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
22d90 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
22da0 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
22db0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
22dc0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
22dd0 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
22de0 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
22df0 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
22e00 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
22e10 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
22e20 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
22e30 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
22e40 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
22e50 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
22e60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
22e70 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
22e80 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
22e90 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
22ea0 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
22eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22ec0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
22ed0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
22ee0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
22ef0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
22f00 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
22f10 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
22f20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
22f50 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
22f60 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
22f70 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
22f80 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
22f90 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22fb0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
22fc0 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
22fd0 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
22fe0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
22ff0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
23000 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
23010 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
23020 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
23030 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
23040 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
23050 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
23060 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 29  oc64( sizeof(*p)
23070 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
23080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23090 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
230a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
230b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
230c0 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
230d0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
230e0 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
230f0 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
23100 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
23110 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
23120 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
23130 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
23140 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
23150 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
23160 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
23170 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
23180 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
23190 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
231a0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
231b0 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
231c0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
231e0 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
231f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
23200 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
23210 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
23220 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23230 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64  BasePath = pDbFd
23240 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a  ->zPath;.#endif.
23250 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74  .    /* Call fst
23260 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  at() to figure o
23270 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ut the permissio
23280 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ns on the databa
23290 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20  se file. If.    
232a0 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66  ** a new *-shm f
232b0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
232c0 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20  an attempt will 
232d0 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74  be made to creat
232e0 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68  e it.    ** with
232f0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
23300 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  sions..    */.  
23310 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44    if( osFstat(pD
23320 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  bFd->h, &sStat) 
23330 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  && pInode->bProc
23340 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
23350 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23360 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
23370 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
23380 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  _err;.    }..#if
23390 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
233a0 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68  IRECTORY.    nSh
233b0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65  mFilename = size
233c0 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  of(SQLITE_SHM_DI
233d0 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23  RECTORY) + 31;.#
233e0 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c  else.    nShmFil
233f0 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74  ename = 6 + (int
23400 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74  )strlen(zBasePat
23410 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
23420 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
23430 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
23440 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
23450 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  nShmFilename );.
23460 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
23470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
23480 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
23490 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
234a0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
234b0 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
234c0 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
234d0 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c  ShmNode)+nShmFil
234e0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d  ename);.    zShm
234f0 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e  Filename = pShmN
23500 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ode->zFilename =
23510 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64   (char*)&pShmNod
23520 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  e[1];.#ifdef SQL
23530 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
23540 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  Y.    sqlite3_sn
23550 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
23560 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
23570 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
23580 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
23590 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
235a0 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
235b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
235c0 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
235d0 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
235e0 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
235f0 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
23600 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
23610 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
23620 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
23630 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20  zBasePath);.    
23640 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
23650 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  x3(pDbFd->zPath,
23660 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
23670 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
23680 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ode->h = -1;.   
23690 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
236a0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
236b0 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
236c0 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  e->pInode = pDbF
236d0 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70  d->pInode;.    p
236e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
236f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
23700 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
23710 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
23720 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
23730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
23740 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
23750 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
23760 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
23770 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
23780 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
23790 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65  ){.      int ope
237a0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
237b0 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20  | O_CREAT;.     
237c0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
237d0 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e  _boolean(pDbFd->
237e0 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79  zPath, "readonly
237f0 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20  _shm", 0) ){.   
23800 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d       openFlags =
23810 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
23820 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52     pShmNode->isR
23830 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
23840 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e     }.      pShmN
23850 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f  ode->h = robust_
23860 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d  open(zShmFilenam
23870 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73  e, openFlags, (s
23880 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37  Stat.st_mode&077
23890 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  7));.      if( p
238a0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a  ShmNode->h<0 ){.
238b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
238c0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
238d0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
238e0 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65  "open", zShmFile
238f0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  name);.        g
23900 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
23910 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
23920 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
23930 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
23940 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72  s root, make sur
23950 65 20 74 68 61 74 20 74 68 65 20 53 48 4d 20 66  e that the SHM f
23960 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ile.      ** is 
23970 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  owned by the sam
23980 65 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73  e user that owns
23990 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
239a0 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69  tabase.  Otherwi
239b0 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  se,.      ** the
239c0 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20   original owner 
239d0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
239e0 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20   to connect..   
239f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6f 73 46 63     */.      osFc
23a00 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  hown(pShmNode->h
23a10 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20  , sStat.st_uid, 
23a20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20  sStat.st_gid);. 
23a30 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b   .      /* Check
23a40 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
23a50 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
23a60 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
23a70 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20  an switch..     
23a80 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e   ** If not, trun
23a90 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
23aa0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20   zero length. . 
23ab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
23ac0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23ad0 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53      if( unixShmS
23ae0 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
23af0 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
23b00 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
23b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23b20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
23b30 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
23b40 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
23b50 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
23b60 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
23b70 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75  R_SHMOPEN, "ftru
23b80 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65  ncate", zShmFile
23b90 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
23ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23bd0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
23be0 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
23bf0 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
23c00 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
23c10 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
23c20 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
23c30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
23c40 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
23c50 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
23c60 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
23c70 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
23c80 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
23c90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
23ca0 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
23cb0 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
23cc0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
23cd0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
23ce0 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
23cf0 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
23d00 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
23d10 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
23d20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
23d30 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
23d40 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
23d50 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
23d60 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
23d70 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
23d80 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
23d90 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
23da0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
23db0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
23dc0 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
23dd0 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
23de0 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
23df0 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
23e00 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
23e10 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
23e20 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
23e30 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
23e40 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
23e50 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
23e60 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
23e70 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
23e80 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
23e90 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
23ea0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
23eb0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
23ec0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
23ed0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
23ee0 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
23ef0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
23f00 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
23f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23f20 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
23f30 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
23f40 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
23f50 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
23f60 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
23f70 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
23f80 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
23f90 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
23fa0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
23fb0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
23fc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23fd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23fe0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
23ff0 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
24000 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
24010 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
24020 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
24030 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
24040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
24050 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
24060 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
24070 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
24080 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
24090 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
240a0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
240b0 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
240c0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
240d0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
240e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
240f0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
24100 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
24110 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
24120 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
24130 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
24140 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
24150 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
24160 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
24170 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
24180 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
24190 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
241a0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
241b0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
241c0 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
241d0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
241e0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
241f0 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
24200 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
24210 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
24220 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
24230 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
24240 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
24250 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
24260 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
24270 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
24280 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
24290 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
242a0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
242b0 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
242c0 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
242d0 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
242e0 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
242f0 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
24300 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
24310 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
24320 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
24330 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
24340 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
24350 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
24360 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
24370 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
24380 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24390 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
243a0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
243b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
243c0 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
243d0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
243e0 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24400 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
24410 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
24420 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
24430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
24440 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
24450 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
24480 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
24490 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
244a0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
244b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
244c0 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
244d0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
244e0 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
244f0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
24500 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
24510 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
24520 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24530 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68  TE_OK;.  int nSh
24540 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
24550 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
24560 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f  .  int nReqRegio
24570 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
24580 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
24590 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
245a0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
245b0 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66   it now. */.  if
245c0 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
245d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
245e0 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
245f0 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
24600 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24610 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
24620 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ..  p = pDbFd->p
24630 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  Shm;.  pShmNode 
24640 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
24650 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
24660 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
24670 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
24680 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
24690 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
246a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
246b0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  on==0 );.  asser
246c0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
246d0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
246e0 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
246f0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
24700 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
24710 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
24720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
24730 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
24740 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
24750 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
24760 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e  ..  /* Minimum n
24770 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73  umber of regions
24780 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
24790 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65  mapped. */.  nRe
247a0 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67  qRegion = ((iReg
247b0 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20  ion+nShmPerMap) 
247c0 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20  / nShmPerMap) * 
247d0 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69  nShmPerMap;..  i
247e0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
247f0 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20  gion<nReqRegion 
24800 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70  ){.    char **ap
24810 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
24820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
24830 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61   apRegion[] arra
24840 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
24850 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a  te = nReqRegion*
24860 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d  szRegion;   /* M
24870 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
24880 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
24890 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
248a0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
248b0 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66      /* Used by f
248c0 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70  stat() */..    p
248d0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
248e0 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
248f0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
24900 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >h>=0 ){.      /
24910 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
24920 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
24930 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
24940 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
24950 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a   space..      **
24960 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
24970 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
24980 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
24990 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
249a0 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  le is.      ** l
249b0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
249c0 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
249d0 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
249e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
249f0 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64   osFstat(pShmNod
24a00 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
24a10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24a20 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
24a30 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ZE;.        goto
24a40 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
24a50 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
24a60 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  f( sStat.st_size
24a70 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
24a80 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
24a90 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
24aa0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
24ab0 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
24ac0 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  et to.        **
24ad0 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
24ae0 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
24af0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
24b00 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
24b10 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
24b20 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74         if( !bExt
24b30 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  end ){.         
24b40 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24b50 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
24b60 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
24b70 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65  tively, if bExte
24b80 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65  nd is true, exte
24b90 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20  nd the file. Do 
24ba0 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
24bb0 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  ** writing a sin
24bc0 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
24bd0 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29  end of each (OS)
24be0 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20   page being.    
24bf0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
24c00 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65   or extended. Te
24c10 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65  chnically, we ne
24c20 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f  ed only write to
24c30 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
24c40 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64  last page in ord
24c50 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  er to extend the
24c60 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69   file. But writi
24c70 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20  ng to all new.  
24c80 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66        ** pages f
24c90 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20  orces the OS to 
24ca0 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d  allocate them im
24cb0 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68  mediately, which
24cc0 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20   reduces.       
24cd0 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20   ** the chances 
24ce0 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20  of SIGBUS while 
24cf0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61  accessing the ma
24d00 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65  pped region late
24d10 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  r on..        */
24d20 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20  .        else{. 
24d30 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
24d40 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
24d50 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20   4096;.         
24d60 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20   int iPg;..     
24d70 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
24d80 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
24d90 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c  f each newly all
24da0 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64  ocated or extend
24db0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
24dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42       assert( (nB
24dd0 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29  yte % pgsz)==0 )
24de0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
24df0 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69  iPg=(sStat.st_si
24e00 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e  ze/pgsz); iPg<(n
24e10 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b  Byte/pgsz); iPg+
24e20 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
24e30 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65  if( seekAndWrite
24e40 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  Fd(pShmNode->h, 
24e50 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d  iPg*pgsz + pgsz-
24e60 31 2c 20 22 22 2c 20 31 2c 20 30 29 21 3d 31 20  1, "", 1, 0)!=1 
24e70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
24e90 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  le = pShmNode->z
24ea0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
24eb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
24ec0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
24ed0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
24ee0 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b  "write", zFile);
24ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
24f00 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
24f20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24f30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24f40 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
24f50 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
24f60 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
24f70 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
24f80 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
24f90 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68  .    apNew = (ch
24fa0 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
24fb0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
24fc0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
24fd0 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69  n, nReqRegion*si
24fe0 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20  zeof(char *).   
24ff0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
25000 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
25010 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
25020 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
25030 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
25040 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
25050 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  >apRegion = apNe
25060 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  w;.    while( pS
25070 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
25080 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20  nReqRegion ){.  
25090 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73      int nMap = s
250a0 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d  zRegion*nShmPerM
250b0 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  ap;.      int i;
250c0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65  .      void *pMe
250d0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  m;.      if( pSh
250e0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
250f0 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73         pMem = os
25100 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20  Mmap(0, nMap,.  
25110 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
25120 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f  de->isReadonly ?
25130 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f   PROT_READ : PRO
25140 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54  T_READ|PROT_WRIT
25150 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
25160 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d  MAP_SHARED, pShm
25170 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f  Node->h, szRegio
25180 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d  n*(i64)pShmNode-
25190 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20  >nRegion.       
251a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
251b0 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pMem==MAP_FAILED
251c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
251d0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
251e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
251f0 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68  MAP, "mmap", pSh
25200 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
25210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
25220 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
25230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25240 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
25250 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  em = sqlite3_mal
25260 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b  loc64(szRegion);
25270 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
25280 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
25290 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
252a0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  MEM;.          g
252b0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
252c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
252d0 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
252e0 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
252f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
25300 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d  (i=0; i<nShmPerM
25310 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ap; i++){.      
25320 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
25330 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
25340 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63  Region+i] = &((c
25350 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67  har*)pMem)[szReg
25360 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  ion*i];.      }.
25370 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
25380 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50  nRegion += nShmP
25390 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  erMap;.    }.  }
253a0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
253b0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
253c0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
253d0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
253e0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
253f0 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
25400 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
25410 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
25420 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
25430 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
25450 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
25460 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
25470 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
25480 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25490 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
254a0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
254b0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
254c0 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
254d0 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
254e0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
254f0 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
25500 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
25510 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
25520 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
25530 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
25540 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
25550 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
25560 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
25570 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
25580 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
25590 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
255a0 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
255b0 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
255c0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
255d0 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
255e0 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
255f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
25600 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
25610 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
25620 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
25630 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
25640 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
25650 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25670 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
25680 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
25690 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
256c0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
256d0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
256e0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25700 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
25710 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
25720 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
25730 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
25740 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
25750 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
25760 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
25770 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
25780 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
25790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
257a0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
257b0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
257c0 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257e0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
257f0 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
25800 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
25810 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
25820 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
25830 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
25840 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
25850 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25860 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
25870 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
25880 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
25890 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
258c0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
258d0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
258e0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
258f0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
25900 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
25910 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
25920 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
25930 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
25940 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
25950 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
25960 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
25970 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
25980 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
25990 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
259a0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
259b0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
259c0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
259d0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
259e0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
259f0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
25a00 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
25a10 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
25a20 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
25a30 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
25a40 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
25a50 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
25a60 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
25a70 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
25a80 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
25a90 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
25aa0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
25ab0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
25ac0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
25ad0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
25ae0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
25af0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
25b00 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
25b10 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
25b20 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
25b30 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
25b40 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
25b50 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
25b60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
25b70 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
25b80 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
25b90 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
25ba0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
25bb0 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
25bc0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
25bd0 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
25be0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
25bf0 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
25c00 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
25c10 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
25c20 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
25c30 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
25c40 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
25c50 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
25c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
25c70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
25c80 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
25c90 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
25ca0 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
25cb0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
25cc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
25cd0 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
25ce0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
25cf0 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
25d00 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
25d10 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
25d20 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
25d30 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
25d40 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
25d50 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
25d60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25d70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
25d80 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
25d90 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
25da0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25db0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
25dc0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
25dd0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
25de0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
25df0 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
25e00 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
25e10 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
25e20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
25e30 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
25e40 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
25e50 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
25e60 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
25e70 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
25e80 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
25e90 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
25ea0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
25eb0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
25ec0 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
25ed0 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
25ee0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
25ef0 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
25f00 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
25f10 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
25f20 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
25f30 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
25f40 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
25f50 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
25f60 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
25f70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
25f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
25f90 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
25fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
25fb0 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
25fc0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
25fd0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
25fe0 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
25ff0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
26000 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
26010 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
26030 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
26040 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
26050 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
26060 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
26070 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
26080 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
26090 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
260a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
260b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
260c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
260d0 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
260e0 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
260f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26100 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
26110 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
26120 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
26130 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
26140 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
26150 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
26160 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
26170 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
26180 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
26190 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
261a0 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
261b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
261c0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
261d0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
261e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
261f0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
26200 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
26210 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
26220 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
26230 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26240 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
26250 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26260 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
26270 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
26280 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
26290 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
262a0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
262b0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
262c0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
262d0 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
262e0 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
262f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26300 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
26310 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
26320 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
26330 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
26340 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
26350 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26360 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
26370 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
26380 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
26390 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
263a0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
263b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
263c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
263d0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
263e0 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
263f0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
26400 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
26410 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
26420 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
26430 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20  d, osGetpid(0), 
26440 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
26450 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
26460 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26470 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
26480 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
26490 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
264a0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
264b0 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
264c0 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
264d0 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
264e0 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
264f0 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
26500 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
26510 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
26520 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
26530 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
26540 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
26550 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
26560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
26570 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
26580 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
26590 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
265a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
265b0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d  d);.  sqlite3Mem
265c0 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20  oryBarrier();   
265d0 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65        /* compile
265e0 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
265f0 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e   barrier */.  un
26600 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26620 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72   Also mutex, for
26630 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20   redundancy */. 
26640 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
26650 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
26660 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
26670 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
26680 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
26690 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
266a0 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
266b0 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  g is true..**.**
266c0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
266d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  shared memory as
266e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
266f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65  e connection the
26700 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
26710 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
26720 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
26730 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61   int unixShmUnma
26740 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
26750 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
26760 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
26770 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
26780 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  file */.  int de
26790 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
267a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
267b0 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ete shared-memor
267c0 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  y if true */.){.
267d0 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20    unixShm *p;   
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
26800 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  ion to be closed
26810 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
26820 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
26830 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
26840 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
26850 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
26860 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20  unixShm **pp;   
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26880 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
26890 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
268a0 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69  ections */.  uni
268b0 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  xFile *pDbFd;   
268c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
268d0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
268e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
268f0 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78  .  pDbFd = (unix
26900 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
26910 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
26920 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
26930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
26940 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
26950 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Node;..  assert(
26960 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
26970 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
26980 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
26990 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
269a0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
269b0 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
269c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
269d0 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
269e0 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
269f0 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
26a00 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
26a10 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
26a20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
26a30 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
26a40 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
26a50 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
26a60 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
26a70 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
26a80 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
26a90 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
26aa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
26ab0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
26ac0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
26ad0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
26ae0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
26af0 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
26b00 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
26b10 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
26b20 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
26b30 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
26b40 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
26b50 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
26b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26b70 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
26b80 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
26b90 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
26ba0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
26bb0 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
26bc0 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  g && pShmNode->h
26bd0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  >=0 ){.      osU
26be0 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e  nlink(pShmNode->
26bf0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
26c00 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72  }.    unixShmPur
26c10 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20  ge(pDbFd);.  }. 
26c20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
26c30 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
26c40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73  ITE_OK;.}...#els
26c50 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  e.# define unixS
26c60 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
26c70 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
26c80 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
26c90 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a  nixShmBarrier 0.
26ca0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
26cb0 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
26cc0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
26cd0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
26ce0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
26cf0 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
26d00 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   If it is curren
26d10 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  tly memory mappe
26d20 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46  d, unmap file pF
26d30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
26d40 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28  d unixUnmapfile(
26d50 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
26d60 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
26d70 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
26d80 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
26d90 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75  gion ){.    osMu
26da0 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65  nmap(pFd->pMapRe
26db0 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53  gion, pFd->mmapS
26dc0 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20  izeActual);.    
26dd0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
26de0 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
26df0 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
26e00 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
26e10 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ual = 0;.  }.}..
26e20 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
26e30 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
26e40 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
26e50 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  ing maintained b
26e60 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72  y file .** descr
26e70 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65  iptor pFd to nNe
26e80 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69  w bytes. Any exi
26e90 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
26ea0 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a   discarded..**.*
26eb0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
26ec0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
26ed0 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ets the followin
26ee0 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a  g variables:.**.
26ef0 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
26f00 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20  e.pMapRegion.** 
26f10 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d        unixFile.m
26f20 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20  mapSize.**      
26f30 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
26f40 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49  zeActual.**.** I
26f50 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  f unsuccessful, 
26f60 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
26f70 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73   is logged via s
26f80 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64  qlite3_log() and
26f90 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61  .** the three va
26fa0 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72  riables above ar
26fb0 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69  e zeroed. In thi
26fc0 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68  s case SQLite sh
26fd0 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  ould.** continue
26fe0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
26ff0 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
27000 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57  e xRead() and xW
27010 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  rite().** method
27020 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
27030 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28  d unixRemapfile(
27040 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
27050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27060 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
27070 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  iptor object */.
27080 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20    i64 nNew      
27090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270a0 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61    /* Required ma
270b0 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b  pping size */.){
270c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
270d0 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20  Err = "mmap";.  
270e0 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20  int h = pFd->h; 
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27100 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
27110 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
27120 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  db file */.  u8 
27130 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70  *pOrig = (u8 *)p
27140 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20  Fd->pMapRegion; 
27150 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
27160 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70  current file map
27170 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  ping */.  i64 nO
27180 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  rig = pFd->mmapS
27190 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f  izeActual;     /
271a0 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20  * Size of pOrig 
271b0 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20  region in bytes 
271c0 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20  */.  u8 *pNew = 
271d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
271e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
271f0 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70  ation of new map
27200 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ping */.  int fl
27210 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b  ags = PROT_READ;
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27230 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
27240 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20  to mmap() */..  
27250 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
27260 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
27270 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d  ssert( nNew>pFd-
27280 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
27290 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64  ssert( nNew<=pFd
272a0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b  ->mmapSizeMax );
272b0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
272c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
272d0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
272e0 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  al>=pFd->mmapSiz
272f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  e );.  assert( M
27300 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a  AP_FAILED!=0 );.
27310 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
27320 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20  MAP_READWRITE.  
27330 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
27340 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52  ags & UNIXFILE_R
27350 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67  DONLY)==0 ) flag
27360 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b  s |= PROT_WRITE;
27370 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
27380 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45  Orig ){.#if HAVE
27390 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20  _MREMAP.    i64 
273a0 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d  nReuse = pFd->mm
273b0 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20  apSize;.#else.  
273c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79    const int szSy
273d0 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67  spage = osGetpag
273e0 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34  esize();.    i64
273f0 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e   nReuse = (pFd->
27400 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53  mmapSize & ~(szS
27410 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64  yspage-1));.#end
27420 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20  if.    u8 *pReq 
27430 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d  = &pOrig[nReuse]
27440 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20  ;..    /* Unmap 
27450 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65  any pages of the
27460 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
27470 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65  g that cannot be
27480 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20   reused. */.    
27490 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69  if( nReuse!=nOri
274a0 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e  g ){.      osMun
274b0 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d  map(pReq, nOrig-
274c0 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  nReuse);.    }..
274d0 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
274e0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65      pNew = osMre
274f0 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73  map(pOrig, nReus
27500 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f  e, nNew, MREMAP_
27510 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45  MAYMOVE);.    zE
27520 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23  rr = "mremap";.#
27530 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
27540 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65  osMmap(pReq, nNe
27550 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c  w-nReuse, flags,
27560 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20   MAP_SHARED, h, 
27570 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28  nReuse);.    if(
27580 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45   pNew!=MAP_FAILE
27590 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  D ){.      if( p
275a0 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20  New!=pReq ){.   
275b0 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e       osMunmap(pN
275c0 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73  ew, nNew - nReus
275d0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
275e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
275f0 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  e{.        pNew 
27600 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d  = pOrig;.      }
27610 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
27620 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70     /* The attemp
27630 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  t to extend the 
27640 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
27650 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74   failed. Free it
27660 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65  . */.    if( pNe
27670 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c  w==MAP_FAILED ||
27680 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
27690 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67    osMunmap(pOrig
276a0 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d  , nReuse);.    }
276b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e  .  }..  /* If pN
276c0 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c  ew is still NULL
276d0 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  , try to create 
276e0 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20  an entirely new 
276f0 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  mapping. */.  if
27700 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
27710 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30   pNew = osMmap(0
27720 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d  , nNew, flags, M
27730 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29  AP_SHARED, h, 0)
27740 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65  ;.  }..  if( pNe
27750 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w==MAP_FAILED ){
27760 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
27770 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20     nNew = 0;.   
27780 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
27790 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70  LITE_OK, zErr, p
277a0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20  Fd->zPath);..   
277b0 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28   /* If the mmap(
277c0 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20  ) above failed, 
277d0 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20  assume that all 
277e0 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28  subsequent mmap(
277f0 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77  ) calls.    ** w
27800 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69  ill probably fai
27810 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b  l too. Fall back
27820 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f   to using xRead/
27830 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65  xWrite exclusive
27840 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  ly.    ** in thi
27850 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
27860 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
27870 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d   = 0;.  }.  pFd-
27880 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76  >pMapRegion = (v
27890 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46  oid *)pNew;.  pF
278a0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46  d->mmapSize = pF
278b0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
278c0 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  l = nNew;.}../*.
278d0 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72  ** Memory map or
278e0 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20   remap the file 
278f0 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64  opened by file-d
27900 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69  escriptor pFd (i
27910 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
27920 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c   already mapped,
27930 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
27940 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65  pping is replace
27950 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f  d by the new). O
27960 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  r, if .** there 
27970 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
27980 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69   mapping for thi
27990 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  s file, and ther
279a0 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20  e are still .** 
279b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
279c0 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
279d0 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
279e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
279f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
27a00 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
27a10 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
27a20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
27a30 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20  ted size of .** 
27a40 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63  the mapping to c
27a50 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  reate. Otherwise
27a60 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65  , if nByte is le
27a70 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
27a80 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  en the .** reque
27a90 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65  sted size is the
27aa0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
27ab0 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61  e on disk. The a
27ac0 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
27ad0 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70  e.** created map
27ae0 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74  ping is either t
27af0 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
27b00 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63  e or the value c
27b10 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73  onfigured .** us
27b20 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ing SQLITE_FCNTL
27b30 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69  _MMAP_LIMIT, whi
27b40 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
27b50 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
27b60 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
27b70 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
27b80 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
27b90 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
27ba0 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
27bb0 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
27bc0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
27bd0 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
27be0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
27bf0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
27c00 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c  c int unixMapfil
27c10 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  e(unixFile *pFd,
27c20 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
27c30 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b  64 nMap = nByte;
27c40 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
27c50 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c  sert( nMap>=0 ||
27c60 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
27c70 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d  =0 );.  if( pFd-
27c80 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
27c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27ca0 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
27cb0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
27cc0 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
27cd0 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
27ce0 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
27cf0 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73  n */.    rc = os
27d00 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73  Fstat(pFd->h, &s
27d10 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28  tatbuf);.    if(
27d20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27d30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
27d40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
27d50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  T;.    }.    nMa
27d60 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73  p = statbuf.st_s
27d70 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ize;.  }.  if( n
27d80 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  Map>pFd->mmapSiz
27d90 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70  eMax ){.    nMap
27da0 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
27db0 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Max;.  }..  if( 
27dc0 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
27dd0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ize ){.    if( n
27de0 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  Map>0 ){.      u
27df0 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
27e00 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c  , nMap);.    }el
27e10 73 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55 6e  se{.      unixUn
27e20 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
27e30 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
27e40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
27e50 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
27e60 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
27e70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
27e80 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
27e90 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
27ea0 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
27eb0 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
27ec0 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
27ed0 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
27ee0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
27ef0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
27f00 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
27f10 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
27f20 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
27f30 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
27f40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
27f50 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
27f60 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
27f70 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
27f80 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
27f90 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
27fa0 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
27fb0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
27fc0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27fd0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
27fe0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
27ff0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
28000 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
28010 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
28020 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
28030 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
28040 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
28050 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
28060 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
28070 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75  nce by calling u
28080 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  nixUnfetch()..*/
28090 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
280a0 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
280b0 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
280c0 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
280d0 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
280e0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
280f0 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
28100 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
28110 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
28120 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
28130 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
28140 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66  .  *pp = 0;..#if
28150 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
28160 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
28170 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
28180 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
28190 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
281a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
281b0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64   unixMapfile(pFd
281c0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
281d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
281e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
281f0 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
28200 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
28210 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
28220 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
28230 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
28240 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
28250 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
28260 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
28270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
28290 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
282a0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
282b0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
282c0 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
282d0 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
282e0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
282f0 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63  call to unixFetc
28300 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
28310 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
28320 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
28330 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
28340 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
28350 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
28360 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
28370 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69  assed to the uni
28380 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  xFetch() invocat
28390 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ion. .**.** Or, 
283a0 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
283b0 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
283c0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
283d0 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
283e0 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  d .** to inform 
283f0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
28400 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
28410 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
28420 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a  ting mapping .**
28430 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61   may now be inva
28440 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
28450 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73  e unmapped..*/.s
28460 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
28470 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  fetch(sqlite3_fi
28480 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
28490 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20  , void *p){.#if 
284a0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
284b0 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c  SIZE>0.  unixFil
284c0 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
284d0 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
284e0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
284f0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
28500 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28510 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66  (iOff);..  /* If
28520 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
28530 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
28540 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
28550 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
28560 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
28570 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
28580 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
28590 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
285a0 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
285b0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
285c0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
285d0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
285e0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
285f0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
28600 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
28610 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
28620 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
28630 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
28640 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
28650 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
28660 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
28670 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
28680 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
28690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
286a0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
286b0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
286c0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
286d0 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55  >=0 );.#else.  U
286e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
286f0 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
28700 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
28710 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
28720 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  Off);.#endif.  r
28730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
28750 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
28760 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
28770 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
28780 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
28790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
287a0 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
287b0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
287c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287d0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
287e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28820 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
28830 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
28840 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
28850 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
28860 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
28870 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
28880 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
28890 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
288a0 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
288b0 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
288c0 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
288d0 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
288e0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
288f0 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
28900 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
28910 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
28920 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
28930 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
28940 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
28950 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
28960 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
28970 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
28980 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
28990 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
289a0 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
289b0 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
289c0 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
289d0 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
289e0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
289f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
28a00 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
28a10 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
28a20 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
28a30 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
28a40 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
28a50 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
28a60 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
28a70 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
28a80 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
28a90 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
28aa0 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
28ab0 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
28ac0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
28ad0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20  der-function F, 
28ae0 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
28af0 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
28b00 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
28b10 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
28b20 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
28b30 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
28b40 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
28b50 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
28b60 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
28b70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
28b80 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
28b90 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
28ba0 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
28bb0 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
28bc0 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
28bd0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
28be0 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
28bf0 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
28c00 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
28c10 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
28c20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
28c30 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
28c40 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
28c50 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
28c60 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
28c70 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
28c80 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
28c90 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
28ca0 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
28cb0 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
28cc0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28cd0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
28ce0 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
28cf0 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
28d00 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
28d10 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
28d20 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
28d30 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
28d40 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
28d50 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
28d60 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
28d70 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
28d80 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
28d90 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
28da0 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
28db0 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
28dc0 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c  ,METHOD,VERSION,
28dd0 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43  CLOSE,LOCK,UNLOC
28de0 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29  K,CKLOCK,SHMMAP)
28df0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
28e00 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
28e10 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
28e20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
28e50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e60 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
28e70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ee0 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f00 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f30 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f50 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f80 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
28f90 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
28fa0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28fd0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ff0 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29020 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29040 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29070 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29090 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
290c0 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
290e0 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29100 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29110 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
29120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29130 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29140 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
29150 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
29160 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
29170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
29180 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
291b0 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
291c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
291d0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291f0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
29200 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
29210 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
29220 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
29230 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
29240 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d         \.   SHMM
29250 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AP,             
29260 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29270 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29290 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
292a0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
292b0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
292c0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292e0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
292f0 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
29300 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
29310 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
29340 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
29350 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
29360 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29380 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63     \.   unixFetc
29390 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
293a0 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293d0 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74    \.   unixUnfet
293e0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
293f0 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
29400 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
29430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29470 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
29480 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29490 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28  s *FINDER##Impl(
294a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75  const char *z, u
294b0 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c  nixFile *p){   \
294c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
294d0 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
294e0 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20  ARAMETER(p);    
294f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29510 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
29520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
29560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
295b0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
295c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
295d0 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63  *const FINDER)(c
295e0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
295f0 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20  ile *p)    \.   
29600 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b   = FINDER##Impl;
29610 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
29620 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
29630 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29640 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
29650 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
29660 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
29670 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
29680 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
29690 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
296a0 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
296b0 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
296c0 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
296d0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
296e0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
296f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
29700 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
29710 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
29720 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
29730 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20  t name */.  3,  
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29750 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
29760 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20  memory and mmap 
29770 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  are enabled */. 
29780 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
29790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
297a0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
297b0 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
297c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
297d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
297e0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
297f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
29800 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
29810 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
29820 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
29830 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29840 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29850 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20  xShmMap         
29860 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
29870 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  p method */.).IO
29880 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
29890 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
298a0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
298b0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
298c0 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
298d0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
298e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
298f0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29900 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29920 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
29930 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e   disabled */.  n
29940 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  olockClose,     
29950 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29960 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  se method */.  n
29970 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  olockLock,      
29980 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29990 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
299a0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
299b0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
299c0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
299d0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
299e0 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65  edLock,  /* xChe
299f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29a00 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
29a30 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
29a40 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
29a50 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29a60 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
29a70 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29a80 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
29a90 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
29aa0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29ab0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29ac0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
29ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29ae0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29af0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
29b00 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
29b10 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29b20 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
29b30 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
29b40 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29b50 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
29b60 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
29b70 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29b80 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
29b90 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
29ba0 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b  dLock, /* xCheck
29bb0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29bc0 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
29bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29be0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
29bf0 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
29c00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
29c10 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
29c20 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46  HODS(.  flockIoF
29c30 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29c40 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29c50 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  tion name */.  f
29c60 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
29c70 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29c80 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29c90 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
29ca0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
29cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
29cc0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
29cd0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63  sabled */.  floc
29ce0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
29cf0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
29d00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
29d10 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
29d20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29d30 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
29d40 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29d50 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29d60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
29d70 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
29d80 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck,   /* xCheckR
29d90 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29da0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dc0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
29dd0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29de0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
29df0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
29e00 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29e10 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
29e20 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
29e30 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
29e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29e50 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29e60 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
29e70 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e90 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
29ea0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
29eb0 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20   semXClose,     
29ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
29ed0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
29ee0 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20   semXLock,      
29ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
29f00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29f10 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  semXUnlock,     
29f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
29f30 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
29f40 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
29f50 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
29f60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29f70 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f90 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
29fa0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
29fb0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
29fc0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
29fd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29fe0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
29ff0 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
2a000 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2a010 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2a020 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2a030 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
2a040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2a050 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a060 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2a070 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2a080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2a090 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2a0a0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70  isabled */.  afp
2a0b0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2a0c0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2a0d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
2a0e0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2a0f0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2a100 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
2a110 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2a120 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2a130 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
2a140 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2a150 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
2a160 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2a170 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a190 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2a1a0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2a1b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
2a1c0 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  y locking method
2a1d0 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74   is a "super-met
2a1e0 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73  hod" in the sens
2a1f0 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65  e that it.** ope
2a200 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ns secondary fil
2a210 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
2a220 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20  r the conch and 
2a230 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a  lock files and.*
2a240 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c  * it uses proxy,
2a250 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20   dot-file, AFP, 
2a260 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  and flock() lock
2a270 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74  ing methods on t
2a280 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72  hose.** secondar
2a290 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68  y files.  For th
2a2a0 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
2a2b0 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
2a2c0 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79  lements.** proxy
2a2d0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61   locking is loca
2a2e0 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72  ted much further
2a2f0 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c   down in the fil
2a300 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a  e.  But we need.
2a310 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ** to go ahead a
2a320 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71  nd define the sq
2a330 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a340 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63   and finder func
2a350 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78  tion.** for prox
2a360 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20  y locking here. 
2a370 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64   So we forward d
2a380 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d  eclare the I/O m
2a390 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64  ethods..*/.#if d
2a3a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2a3b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2a3c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a3d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2a3e0 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
2a3f0 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
2a400 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
2a410 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
2a420 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2a430 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
2a440 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
2a450 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
2a460 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
2a470 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2a480 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  t*);.IOMETHODS(.
2a490 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c    proxyIoFinder,
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2a4b0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2a4c0 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f  ame */.  proxyIo
2a4d0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2a4e0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2a4f0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2a500 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2a530 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2a540 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65   */.  proxyClose
2a550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a560 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2a570 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c   */.  proxyLock,
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a590 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2a5a0 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b  */.  proxyUnlock
2a5b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a5c0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2a5d0 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b   */.  proxyCheck
2a5e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2a5f0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2a600 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2a610 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2a620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a630 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2a640 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
2a650 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
2a660 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
2a670 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
2a680 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
2a690 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
2a6a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2a6b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2a6c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2a6d0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
2a6e0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2a6f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2a700 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2a710 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
2a720 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2a730 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2a740 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2a750 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a770 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a780 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2a790 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a7b0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2a7c0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7e0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2a7f0 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
2a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a810 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2a820 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
2a830 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2a840 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2a850 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2a860 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a880 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2a890 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
2a8a0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2a8b0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2a8c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2a8d0 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
2a8e0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
2a8f0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
2a900 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
2a910 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
2a920 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
2a930 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
2a940 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
2a950 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
2a960 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
2a970 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
2a980 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
2a990 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
2a9a0 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53  his is for MacOS
2a9b0 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  X only..*/.stati
2a9c0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a9d0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
2a9e0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2a9f0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2aa00 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
2aa10 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
2aa20 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
2aa30 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
2aa40 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20          /* open 
2aa50 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  file object for 
2aa60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2aa70 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  e */.){.  static
2aa80 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61   const struct Ma
2aa90 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73  pping {.    cons
2aaa0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73  t char *zFilesys
2aab0 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  tem;            
2aac0 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20    /* Filesystem 
2aad0 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  type name */.   
2aae0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2aaf0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
2ab00 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70  ods;   /* Approp
2ab10 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  riate locking me
2ab20 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70  thod */.  } aMap
2ab30 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66  [] = {.    { "hf
2ab40 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
2ab50 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2ab60 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "ufs",    &posix
2ab70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2ab80 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66   { "afpfs",  &af
2ab90 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
2aba0 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61    { "smbfs",  &a
2abb0 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
2abc0 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26     { "webdav", &
2abd0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  nolockIoMethods 
2abe0 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
2abf0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
2ac00 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2ac10 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66  Info;.  struct f
2ac20 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
2ac30 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
2ac40 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
2ac50 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
2ac60 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
2ac70 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
2ac80 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
2ac90 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
2aca0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
2acb0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
2acc0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
2acd0 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ds;.  }.  if( st
2ace0 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
2acf0 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
2ad00 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
2ad10 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
2ad20 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
2ad30 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2ad40 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20  thods;.    }.   
2ad50 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69   for(i=0; aMap[i
2ad60 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69  ].zFilesystem; i
2ad70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
2ad80 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
2ad90 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b  stypename, aMap[
2ada0 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d  i].zFilesystem)=
2adb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
2adc0 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65  turn aMap[i].pMe
2add0 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20  thods;.      }. 
2ade0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
2adf0 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e  efault case. Han
2ae00 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74  dles, amongst ot
2ae10 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a  hers, "nfs"..  *
2ae20 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
2ae30 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
2ae40 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
2ae50 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
2ae60 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
2ae70 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
2ae80 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
2ae90 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
2aea0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
2aeb0 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
2aec0 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
2aed0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
2aee0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
2aef0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
2af00 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
2af10 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
2af20 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
2af30 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
2af40 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
2af50 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2af60 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20  , "nfs")==0 ){. 
2af70 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73       return &nfs
2af80 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2af90 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65   else {.      re
2afa0 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
2afb0 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  hods;.    }.  }e
2afc0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2afd0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2afe0 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
2aff0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2b000 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
2b010 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
2b020 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
2b030 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
2b040 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2b050 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
2b060 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2b070 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2b080 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b090 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58  LE */..#if OS_VX
2b0a0 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  WORKS./*.** This
2b0b0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
2b0c0 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20 63  on for VxWorks c
2b0d0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
2b0e0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a 2a  posix advisory.*
2b0f0 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e  * locking works.
2b100 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68    If it does, th
2b110 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74 20  en that is what 
2b120 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74 20  is used.  If it 
2b130 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b  does not.** work
2b140 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20  , then fallback 
2b150 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  to named semapho
2b160 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  re locking..*/.s
2b170 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2b180 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2b190 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
2b1a0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
2b1b0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
2b1c0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2b1d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2b1e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2b1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
2b200 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  e open file obje
2b210 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
2b220 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2b230 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2b240 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2b250 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2b260 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2b270 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2b280 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2b290 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2b2a0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2b2b0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2b2c0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2b2d0 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  thods;.  }..  /*
2b2e0 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29   Test if fcntl()
2b2f0 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e   is supported an
2b300 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c  d use POSIX styl
2b310 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74  e locks..  ** Ot
2b320 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63  herwise fall bac
2b330 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73  k to the named s
2b340 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e  emaphore method.
2b350 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
2b360 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
2b370 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
2b380 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
2b390 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
2b3a0 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
2b3b0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
2b3c0 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
2b3d0 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
2b3e0 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
2b3f0 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  ) {.    return &
2b400 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
2b410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2b420 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64  urn &semIoMethod
2b430 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
2b440 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2b450 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
2b460 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46 69  onst vxworksIoFi
2b470 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
2b480 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76  *,unixFile*) = v
2b490 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d  xworksIoFinderIm
2b4a0 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
2b4b0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a  S_VXWORKS */../*
2b4c0 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20  .** An abstract 
2b4d0 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74  type for a point
2b4e0 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68  er to an IO meth
2b4f0 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
2b500 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
2b510 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2b520 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
2b530 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
2b540 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a  ar*,unixFile*);.
2b550 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2b560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2b5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
2b5c0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
2b5d0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2b5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2b5f0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
2b600 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
2b610 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2b620 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
2b630 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
2b640 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
2b650 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2b660 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b670 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2b680 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
2b690 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pId..*/.static 
2b6a0 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
2b6b0 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
2b6c0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
2b6d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
2b6e0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
2b6f0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2b700 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
2b710 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
2b720 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2b730 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2b740 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
2b750 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
2b760 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2b770 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2b780 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2b790 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
2b7a0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
2b7b0 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ned */.  int ctr
2b7c0 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
2b7d0 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   /* Zero or more
2b7e0 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75   UNIXFILE_* valu
2b7f0 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
2b800 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2b810 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
2b820 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
2b830 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
2b840 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
2b850 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2b860 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
2b870 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
2b880 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65    /* Usually the
2b890 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20   path zFilename 
2b8a0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
2b8b0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2b8c0 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65  e. The.  ** exce
2b8d0 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70  ption is when op
2b8e0 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20  ening the proxy 
2b8f0 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20  "conch" file in 
2b900 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a  builds that.  **
2b910 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65   include the spe
2b920 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69  cial Apple locki
2b930 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a  ng styles..  */.
2b940 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2b950 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2b960 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2b970 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20  STYLE.  assert( 
2b980 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
2b990 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
2b9a0 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e  ' .    || pVfs->
2b9b0 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a  pAppData==(void*
2b9c0 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
2b9d0 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73  er );.#else.  as
2b9e0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
2b9f0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
2ba00 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69  0]=='/' );.#endi
2ba10 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69  f..  /* No locki
2ba20 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d  ng occurs in tem
2ba30 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a  porary files */.
2ba40 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2ba50 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46  ame!=0 || (ctrlF
2ba60 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2ba70 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20  NOLOCK)!=0 );.. 
2ba80 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
2ba90 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
2baa0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
2bab0 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
2bac0 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66  pNew->pVfs = pVf
2bad0 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  s;.  pNew->zPath
2bae0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2baf0 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2bb00 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b  = (u8)ctrlFlags;
2bb10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
2bb20 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e  MMAP_SIZE>0.  pN
2bb30 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  ew->mmapSizeMax 
2bb40 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2bb50 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
2bb60 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
2bb70 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
2bb80 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2bb90 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
2bba0 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
2bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbc0 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
2bbd0 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2bbe0 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2bbf0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2bc00 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
2bc10 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
2bc20 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
2bc30 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
2bc40 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2bc50 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2bc60 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
2bc70 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2bc80 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2bc90 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2bca0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2bcb0 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2bcc0 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
2bcd0 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2bce0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
2bcf0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
2bd00 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c  ndif..  if( ctrl
2bd10 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2bd20 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _NOLOCK ){.    p
2bd30 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26  LockingStyle = &
2bd40 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2bd50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
2bd60 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a  ockingStyle = (*
2bd70 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70  *(finder_type*)p
2bd80 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a  Vfs->pAppData)(z
2bd90 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b  Filename, pNew);
2bda0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2bdb0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2bdc0 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
2bdd0 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
2bde0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
2bdf0 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
2be00 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
2be10 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
2be20 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
2be30 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
2be40 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
2be50 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
2be60 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
2be70 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
2be80 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
2be90 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
2bea0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2beb0 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
2bec0 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
2bed0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
2bee0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
2bef0 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20  ixIoMethods.#if 
2bf00 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2bf10 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2bf20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2bf30 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  E.    || pLockin
2bf40 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f  gStyle == &nfsIo
2bf50 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
2bf60 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
2bf70 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
2bf80 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2bf90 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2bfa0 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
2bfb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bfc0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
2bfd0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
2bfe0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2bff0 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
2c000 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
2c010 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2c020 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
2c030 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
2c040 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
2c050 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
2c060 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
2c070 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
2c080 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
2c090 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
2c0a0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
2c0b0 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
2c0c0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2c0d0 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
2c0e0 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
2c0f0 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
2c100 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
2c110 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
2c120 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2c130 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2c140 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
2c150 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
2c160 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
2c170 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
2c180 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
2c190 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
2c1a0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
2c1b0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
2c1c0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
2c1d0 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
2c1e0 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
2c1f0 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
2c200 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
2c210 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
2c220 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
2c230 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
2c240 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
2c250 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2c260 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
2c270 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
2c280 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
2c290 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
2c2a0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
2c2b0 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
2c2c0 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
2c2d0 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
2c2e0 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
2c2f0 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
2c300 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
2c310 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
2c320 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
2c330 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
2c340 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
2c350 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2c360 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
2c370 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2c380 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2c390 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
2c3a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2c3b0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2c3c0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
2c3d0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2c3e0 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
2c3f0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2c400 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
2c410 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2c420 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2c430 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2c440 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
2c450 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
2c460 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
2c470 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
2c480 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2c490 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
2c4a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2c4b0 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  c64( sizeof(*pCt
2c4c0 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
2c4d0 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
2c4e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2c4f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c500 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
2c510 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
2c520 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2c530 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
2c540 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
2c550 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
2c560 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
2c570 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
2c580 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
2c590 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
2c5a0 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
2c5b0 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
2c5c0 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2c5d0 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
2c5e0 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
2c5f0 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
2c600 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2c610 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
2c620 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2c630 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2c640 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2c650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c670 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
2c680 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
2c690 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2c6a0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2c6b0 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
2c6c0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
2c6d0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2c6e0 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
2c6f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2c700 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2c710 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
2c720 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
2c730 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
2c740 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2c750 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2c760 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2c770 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2c780 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
2c790 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
2c7a0 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
2c7b0 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
2c7c0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65  lename;.    asse
2c7d0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
2c7e0 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d   );.    nFilenam
2c7f0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
2c800 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
2c810 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
2c820 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2c830 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61  malloc64(nFilena
2c840 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
2c850 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
2c860 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2c870 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
2c880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2c890 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
2c8a0 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
2c8b0 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
2c8c0 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
2c8d0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
2c8e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2c8f0 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
2c900 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2c910 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2c920 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
2c930 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2c940 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
2c950 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
2c960 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2c970 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
2c980 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
2c990 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
2c9a0 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
2c9b0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2c9c0 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2c9d0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2c9e0 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2c9f0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
2ca00 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
2ca10 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2ca20 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
2ca30 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
2ca40 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
2ca50 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
2ca60 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
2ca70 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2ca80 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
2ca90 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
2caa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2cab0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
2cac0 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
2cad0 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
2cae0 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
2caf0 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
2cb00 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
2cb10 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
2cb20 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
2cb30 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2cb40 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
2cb50 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
2cb60 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
2cb70 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
2cb80 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
2cb90 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
2cba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2cbb0 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
2cbc0 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
2cbd0 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
2cbe0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2cbf0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2cc00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2cc10 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
2cc20 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f  (pNew, 0);.#if O
2cc30 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
2cc40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2cc50 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2cc60 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2cc70 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2cc80 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
2cc90 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
2cca0 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
2ccb0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2ccc0 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20  XFILE_DELETE;.  
2ccd0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
2cce0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ccf0 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
2cd00 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2cd10 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2cd20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
2cd30 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
2cd40 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
2cd50 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
2cd60 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c  .    verifyDbFil
2cd70 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72  e(pNew);.  }.  r
2cd80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2cd90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
2cda0 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
2cdb0 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75  y in which to pu
2cdc0 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
2cdd0 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  s..** If no suit
2cde0 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  able temporary f
2cdf0 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61  ile directory ca
2ce00 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
2ce10 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
2ce20 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
2ce30 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76  nixTempFileDir(v
2ce40 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
2ce50 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
2ce60 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
2ce70 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a       0,.     0,.
2ce80 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
2ce90 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22  .     "/usr/tmp"
2cea0 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20  ,.     "/tmp",. 
2ceb0 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20      0        /* 
2cec0 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20  List terminator 
2ced0 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  */.  };.  unsign
2cee0 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  ed int i;.  stru
2cef0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63  ct stat buf;.  c
2cf00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
2cf10 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30  = 0;..  azDirs[0
2cf20 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  ] = sqlite3_temp
2cf30 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66  _directory;.  if
2cf40 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61  ( !azDirs[1] ) a
2cf50 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e  zDirs[1] = geten
2cf60 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
2cf70 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ");.  if( !azDir
2cf80 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d  s[2] ) azDirs[2]
2cf90 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
2cfa0 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  R");.  for(i=0; 
2cfb0 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
2cfc0 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
2cfd0 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
2cfe0 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a  i++]){.    if( z
2cff0 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
2d000 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61  e;.    if( osSta
2d010 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20  t(zDir, &buf) ) 
2d020 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2d030 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73  ( !S_ISDIR(buf.s
2d040 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e  t_mode) ) contin
2d050 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63  ue;.    if( osAc
2d060 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29  cess(zDir, 07) )
2d070 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62   continue;.    b
2d080 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2d090 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zDir;.}../*.*
2d0a0 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
2d0b0 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
2d0c0 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
2d0d0 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
2d0e0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
2d0f0 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75  g process and mu
2d100 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
2d110 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73   to hold at leas
2d120 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74  t.** pVfs->mxPat
2d130 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a  hname bytes..*/.
2d140 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
2d150 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
2d160 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
2d170 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2d180 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
2d190 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
2d1a0 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
2d1b0 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
2d1c0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
2d1d0 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
2d1e0 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
2d1f0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
2d200 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  j;.  const char 
2d210 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27  *zDir;..  /* It'
2d220 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2d230 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2d240 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2d250 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2d260 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2d270 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2d280 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2d290 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2d2a0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2d2b0 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
2d2c0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2d2d0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2d2e0 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44  E_IOERR );..  zD
2d2f0 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c  ir = unixTempFil
2d300 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44  eDir();.  if( zD
2d310 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22  ir==0 ) zDir = "
2d320 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  .";..  /* Check 
2d330 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
2d340 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
2d350 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
2d360 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
2d370 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
2d380 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
2d390 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
2d3a0 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
2d3b0 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
2d3c0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
2d3d0 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d  PREFIX) + 18) >=
2d3e0 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b   (size_t)nBuf ){
2d3f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d400 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
2d410 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
2d420 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
2d430 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  8, zBuf, "%s/"SQ
2d440 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
2d450 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
2d460 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    j = (int)strle
2d470 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
2d480 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2d490 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
2d4a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
2d4b0 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
2d4c0 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
2d4d0 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
2d4e0 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
2d4f0 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
2d500 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
2d510 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
2d520 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  .    zBuf[j+1] =
2d530 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73   0;.  }while( os
2d540 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d  Access(zBuf,0)==
2d550 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2d560 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
2d570 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2d580 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2d590 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2d5a0 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20  )./*.** Routine 
2d5b0 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75  to transform a u
2d5c0 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70  nixFile into a p
2d5d0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69  roxy-locking uni
2d5e0 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d  xFile..** Implem
2d5f0 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  entation in the 
2d600 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73  proxy-lock divis
2d610 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79  ion, but used by
2d620 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69   unixOpen().** i
2d630 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
2d640 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73  PROXY_LOCKING is
2d650 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
2d660 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
2d670 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
2d680 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20  nixFile*, const 
2d690 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  char*);.#endif..
2d6a0 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
2d6b0 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2d6c0 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
2d6d0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  was opened on th
2d6e0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
2d6f0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
2d700 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75  al or master-jou
2d710 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74  rnal file) ident
2d720 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d  ified by pathnam
2d730 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20  e.** zPath with 
2d740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
2d750 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74  flags matching t
2d760 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74  hose passed as t
2d770 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
2d780 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2d790 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  nction..**.** Su
2d7a0 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  ch a file descri
2d7b0 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69  ptor may exist i
2d7c0 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
2d7d0 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73  nection was clos
2d7e0 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73  ed.** but the as
2d7f0 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65  sociated file de
2d800 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e  scriptor could n
2d810 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63  ot be closed bec
2d820 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  ause some.** oth
2d830 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
2d840 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  or open on the s
2d850 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64  ame file is hold
2d860 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e  ing a file-lock.
2d870 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d  .** Refer to com
2d880 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69  ments in the uni
2d890 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  xClose() functio
2d8a0 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  n and the length
2d8b0 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73  y comment.** des
2d8c0 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41  cribing "Posix A
2d8d0 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22  dvisory Locking"
2d8e0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2d8f0 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a   this file for .
2d900 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69  ** further detai
2d910 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74  ls. Also, ticket
2d920 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66   #4018..**.** If
2d930 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65   a suitable file
2d940 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66   descriptor is f
2d950 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73  ound, then it is
2d960 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2d970 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65  .** such file de
2d980 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61  scriptor is loca
2d990 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  ted, -1 is retur
2d9a0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55  ned..*/.static U
2d9b0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e  nixUnusedFd *fin
2d9c0 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73  dReusableFd(cons
2d9d0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
2d9e0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69  nt flags){.  Uni
2d9f0 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2da00 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f  ed = 0;..  /* Do
2da10 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20   not search for 
2da20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2da30 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77  escriptor on vxw
2da40 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73  orks. Not becaus
2da50 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77  e.  ** vxworks w
2da60 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74  ould not benefit
2da70 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
2da80 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72   (it might, we'r
2da90 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a  e not sure),.  *
2daa0 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f  * but because no
2dab0 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20   way to test it 
2dac0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  is currently ava
2dad0 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65  ilable. It is be
2dae0 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74  tter .  ** not t
2daf0 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20  o risk breaking 
2db00 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20  vxworks support 
2db10 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20  for the sake of 
2db20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20  such an obscure 
2db30 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20  .  ** feature.  
2db40 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
2db50 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  KS.  struct stat
2db60 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
2db70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2db80 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63  ults of stat() c
2db90 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73  all */..  /* A s
2dba0 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66  tat() call may f
2dbb0 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ail for various 
2dbc0 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73  reasons. If this
2dbd0 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a   happens, it is.
2dbe0 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74    ** almost cert
2dbf0 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e  ain that an open
2dc00 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73  () call on the s
2dc10 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c  ame path will al
2dc20 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f  so fail..  ** Fo
2dc30 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69  r this reason, i
2dc40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2dc50 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20  s in the stat() 
2dc60 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73  call here, it is
2dc70 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  .  ** ignored an
2dc80 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  d -1 is returned
2dc90 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2dca0 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20  l try to open a 
2dcb0 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  new file.  ** de
2dcc0 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
2dcd0 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c  same path, fail,
2dce0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
2dcf0 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a  rror to SQLite..
2dd00 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69    **.  ** Even i
2dd10 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  f a subsequent o
2dd20 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20  pen() call does 
2dd30 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e  succeed, the con
2dd40 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a  sequences of.  *
2dd50 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20  * not searching 
2dd60 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66  for a reusable f
2dd70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2dd80 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
2dd90 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
2dda0 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
2ddb0 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
2ddc0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
2ddd0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2dde0 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
2ddf0 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
2de00 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
2de10 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
2de20 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
2de30 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
2de40 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
2de50 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
2de60 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
2de70 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
2de80 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
2de90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
2dea0 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
2deb0 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
2dec0 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
2ded0 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
2dee0 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
2def0 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
2df00 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
2df10 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2df20 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
2df30 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2df40 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
2df50 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2df60 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2df70 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2df80 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
2df90 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
2dfa0 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
2dfb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2dfc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2dfd0 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
2dfe0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2dff0 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
2e000 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
2e010 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
2e020 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
2e030 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2e040 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
2e050 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
2e060 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
2e070 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
2e080 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
2e090 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
2e0a0 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
2e0b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2e0c0 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
2e0d0 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
2e0e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2e0f0 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
2e100 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
2e110 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20  ..**.** In most 
2e120 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74  cases, this rout
2e130 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  ine sets *pMode 
2e140 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c  to 0, which will
2e150 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e   become.** an in
2e160 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75  dication to robu
2e170 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65  st_open() to cre
2e180 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69  ate the file usi
2e190 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46  ng.** SQLITE_DEF
2e1a0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2e1b0 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62  SIONS adjusted b
2e1c0 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
2e1d0 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20  But if the file 
2e1e0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20  being opened is 
2e1f0 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72  a WAL or regular
2e200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
2e210 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e  hen .** this fun
2e220 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68  ction queries th
2e230 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2e240 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  r the permission
2e250 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72  s on the .** cor
2e260 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62  responding datab
2e270 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ase file and set
2e280 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73  s *pMode to this
2e290 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72   value. Whenever
2e2a0 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57   .** possible, W
2e2b0 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  AL and journal f
2e2c0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
2e2d0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
2e2e0 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20  permissions .** 
2e2f0 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  as the associate
2e300 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
2e310 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  .**.** If the SQ
2e320 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
2e330 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20  NAMES option is 
2e340 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
2e350 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69  e.** original fi
2e360 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69  lename is unavai
2e370 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f  lable.  But 8_3_
2e380 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73  NAMES is only us
2e390 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69  ed for.** FAT fi
2e3a0 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65  lesystems and pe
2e3b0 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74  rmissions do not
2e3c0 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73   matter there, s
2e3d0 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68  o just use.** th
2e3e0 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73  e default permis
2e3f0 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
2e400 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46   int findCreateF
2e410 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74  ileMode(.  const
2e420 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2e430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2e440 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73  th of file (poss
2e450 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61  ibly) being crea
2e460 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ted */.  int fla
2e470 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2e480 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2e490 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20  s passed as 4th 
2e4a0 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65  argument to xOpe
2e4b0 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20  n() */.  mode_t 
2e4c0 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pMode,         
2e4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2e4e0 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2e4f0 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a  open file with *
2e500 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c  /.  uid_t *pUid,
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e520 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20      /* OUT: uid 
2e530 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
2e540 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70  le */.  gid_t *p
2e550 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  Gid             
2e560 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2e570 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  gid to set on th
2e580 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  e file */.){.  i
2e590 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e5a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2e5b0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2e5c0 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20  .  *pMode = 0;. 
2e5d0 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70   *pUid = 0;.  *p
2e5e0 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66  Gid = 0;.  if( f
2e5f0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
2e600 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
2e610 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2e620 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44  ) ){.    char zD
2e630 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  b[MAX_PATHNAME+1
2e640 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ];     /* Databa
2e650 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  se file path */.
2e660 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20      int nDb;    
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e680 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
2e690 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44  alid bytes in zD
2e6a0 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  b */.    struct 
2e6b0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2e6c0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2e6d0 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61   of stat() on da
2e6e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2e6f0 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20      /* zPath is 
2e700 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20  a path to a WAL 
2e710 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  or journal file.
2e720 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2e730 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20  lock derives.   
2e740 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20   ** the path to 
2e750 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64  the associated d
2e760 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f  atabase file fro
2e770 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c  m zPath. This bl
2e780 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20  ock handles.    
2e790 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
2e7a0 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69   naming conventi
2e7b0 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ons:.    **.    
2e7c0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2e7d0 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20  b>-journal".    
2e7e0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2e7f0 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20  b>-wal".    **  
2e800 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
2e810 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  ournalNN".    **
2e820 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2e830 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20  -walNN".    **. 
2e840 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69     ** where NN i
2e850 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62  s a decimal numb
2e860 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e  er. The NN namin
2e870 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20  g schemes are . 
2e880 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68     ** used by th
2e890 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78  e test_multiplex
2e8a0 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a  .c module..    *
2e8b0 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69  /.    nDb = sqli
2e8c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2e8d0 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20  h) - 1; .#ifdef 
2e8e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
2e8f0 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c  3_NAMES.    whil
2e900 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69  e( nDb>0 && sqli
2e910 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68  te3Isalnum(zPath
2e920 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a  [nDb]) ) nDb--;.
2e930 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c      if( nDb==0 |
2e940 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  | zPath[nDb]!='-
2e950 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ' ) return SQLIT
2e960 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  E_OK;.#else.    
2e970 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62  while( zPath[nDb
2e980 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
2e990 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b  assert( nDb>0 );
2e9a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
2e9b0 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20  Path[nDb]!='\n' 
2e9c0 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a  );.      nDb--;.
2e9d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2e9e0 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61   memcpy(zDb, zPa
2e9f0 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44  th, nDb);.    zD
2ea00 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a  b[nDb] = '\0';..
2ea10 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
2ea20 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29  t(zDb, &sStat) )
2ea30 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d  {.      *pMode =
2ea40 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26   sStat.st_mode &
2ea50 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55   0777;.      *pU
2ea60 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69  id = sStat.st_ui
2ea70 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d  d;.      *pGid =
2ea80 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20   sStat.st_gid;. 
2ea90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eaa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2eab0 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
2eac0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
2ead0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2eae0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
2eaf0 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
2eb00 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
2eb10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
2eb20 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68  n the file zPath
2eb30 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75  ..** .** Previou
2eb40 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20  sly, the SQLite 
2eb50 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68  OS layer used th
2eb60 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ree functions in
2eb70 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a   place of this.*
2eb80 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  * one:.**.**    
2eb90 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2eba0 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20  adWrite();.**   
2ebb0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2ebc0 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20  eadOnly();.**   
2ebd0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45    sqlite3OsOpenE
2ebe0 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a  xclusive();.**.*
2ebf0 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f  * These calls co
2ec00 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
2ec10 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
2ec20 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a  ations of flags:
2ec30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57  .**.**     ReadW
2ec40 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52  rite() ->     (R
2ec50 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2ec60 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e  E).**     ReadOn
2ec70 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45  ly()  ->     (RE
2ec80 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20  ADONLY) .**     
2ec90 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2eca0 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20  -> (READWRITE | 
2ecb0 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49  CREATE | EXCLUSI
2ecc0 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c  VE).**.** The ol
2ecd0 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  d OpenExclusive(
2ece0 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f  ) accepted a boo
2ecf0 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20  lean argument - 
2ed00 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a  "delFlag". If.**
2ed10 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20   true, the file 
2ed20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74  was configured t
2ed30 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
2ed40 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
2ed50 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64  the.** file hand
2ed60 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63  le closed. To ac
2ed70 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65  hieve the same e
2ed80 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73  ffect using this
2ed90 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61   new .** interfa
2eda0 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45  ce, add the DELE
2edb0 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74  TEONCLOSE flag t
2edc0 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
2edd0 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20  d above for .** 
2ede0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e  OpenExclusive().
2edf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2ee00 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  nixOpen(.  sqlit
2ee10 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2ee20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
2ee30 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  FS for which thi
2ee40 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d  s is the xOpen m
2ee50 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
2ee60 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2ee70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e          /* Pathn
2ee80 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2ee90 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  e opened */.  sq
2eea0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2eeb0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2eec0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2eed0 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69  r to be filled i
2eee0 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  n */.  int flags
2eef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ef00 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61      /* Input fla
2ef10 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  gs to control th
2ef20 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69  e opening */.  i
2ef30 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2ef50 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75  utput flags retu
2ef60 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63  rned to SQLite c
2ef70 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ore */.){.  unix
2ef80 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46  File *p = (unixF
2ef90 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
2efa0 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  nt fd = -1;     
2efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2efc0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2efd0 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65   returned by ope
2efe0 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65  n() */.  int ope
2eff0 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  nFlags = 0;     
2f000 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2f010 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
2f020 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
2f030 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
2f040 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
2f050 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
2f060 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20  /.  int noLock; 
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f080 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
2f090 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  it locking primi
2f0a0 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tives */.  int r
2f0b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2f0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
2f0d0 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64  ction Return Cod
2f0e0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  e */.  int ctrlF
2f0f0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
2f100 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c        /* UNIXFIL
2f110 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20  E_* flags */..  
2f120 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
2f130 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2f140 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
2f150 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
2f160 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
2f170 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
2f180 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
2f190 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
2f1a0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2f1b0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
2f1c0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
2f1d0 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
2f1e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2f1f0 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
2f200 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
2f210 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f220 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20  READWRITE);.#if 
2f230 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2f240 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
2f250 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d  t isAutoProxy  =
2f260 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2f270 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
2f280 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
2f290 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2f2a0 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
2f2b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2f2c0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
2f2d0 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20  sInfo;.#endif.. 
2f2e0 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
2f2f0 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e  a master or main
2f300 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  -file journal, t
2f310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
2f320 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69  l open.  ** a fi
2f330 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le-descriptor on
2f340 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
2f350 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  oo. The first ti
2f360 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20  me unixSync().  
2f370 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ** is called the
2f380 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
2f390 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2f3a0 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64  be fsync()ed and
2f3b0 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a   close()d..  */.
2f3c0 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20    int syncDir = 
2f3d0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
2f3e0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
2f3f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2f400 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
2f410 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2f420 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2f430 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2f440 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2f450 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  L.  ));..  /* If
2f460 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
2f470 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
2f480 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
2f490 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
2f4a0 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
2f4b0 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
2f4c0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
2f4d0 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
2f4e0 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
2f4f0 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
2f500 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63  PATHNAME+2];.  c
2f510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2f520 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
2f530 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
2f540 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
2f550 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
2f560 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
2f570 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
2f580 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
2f590 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
2f5a0 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
2f5b0 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
2f5c0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
2f5d0 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
2f5e0 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
2f5f0 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
2f600 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
2f610 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
2f620 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
2f630 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
2f640 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
2f650 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
2f660 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
2f670 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
2f680 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
2f690 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
2f6a0 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
2f6b0 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
2f6c0 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
2f6d0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
2f6e0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2f6f0 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
2f700 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
2f710 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
2f720 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
2f730 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
2f740 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
2f750 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
2f760 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
2f770 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
2f780 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
2f790 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
2f7a0 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
2f7b0 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
2f7c0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2f7d0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2f7e0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2f7f0 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
2f800 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2f810 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2f820 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2f830 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
2f840 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2f850 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2f860 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2f870 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2f880 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
2f890 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2f8a0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2f8b0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
2f8c0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
2f8d0 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
2f8e0 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
2f8f0 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
2f900 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
2f910 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
2f920 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2f930 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2f940 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2f950 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
2f960 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2f970 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
2f980 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2f990 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
2f9a0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
2f9b0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f9c0 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
2f9d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f9e0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2f9f0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
2fa00 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2fa10 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
2fa20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2fa30 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f  EN_WAL.  );..  /
2fa40 2a 20 44 65 74 65 63 74 20 61 20 70 69 64 20 63  * Detect a pid c
2fa50 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20  hange and reset 
2fa60 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65  the PRNG.  There
2fa70 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
2fa80 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73  tion.  ** here s
2fa90 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20  uch that two or 
2faa0 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c  more threads all
2fab0 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20   trying to open 
2fac0 64 61 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a  databases at.  *
2fad0 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61  * the same insta
2fae0 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73  nt might all res
2faf0 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75  et the PRNG.  Bu
2fb00 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74  t multiple reset
2fb10 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c  s.  ** are harml
2fb20 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
2fb30 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f  randomnessPid!=o
2fb40 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20  sGetpid(0) ){.  
2fb50 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20    randomnessPid 
2fb60 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20  = osGetpid(0);. 
2fb70 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
2fb80 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a  mness(0,0);.  }.
2fb90 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
2fba0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
2fbb0 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  );..  if( eType=
2fbc0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2fbd0 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78  N_DB ){.    Unix
2fbe0 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2fbf0 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  d;.    pUnused =
2fc00 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
2fc10 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20  zName, flags);. 
2fc20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
2fc30 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e  {.      fd = pUn
2fc40 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65  used->fd;.    }e
2fc50 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73  lse{.      pUnus
2fc60 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
2fc70 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55  loc64(sizeof(*pU
2fc80 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69  nused));.      i
2fc90 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20  f( !pUnused ){. 
2fca0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2fcb0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2fcc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
2fcd0 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
2fce0 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61  ed;..    /* Data
2fcf0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
2fd00 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
2fd10 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
2fd20 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a  y are not.    **
2fd30 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
2fd40 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
2fd50 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
2fd60 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
2fd70 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
2fd80 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
2fd90 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c  .    assert( (fl
2fda0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2fdb0 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b  N_URI) || zName[
2fdc0 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
2fdd0 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20  ==0 );..  }else 
2fde0 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
2fdf0 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
2fe00 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
2fe10 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
2fe20 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
2fe30 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2fe40 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e  isDelete && !syn
2fe50 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  cDir);.    rc = 
2fe60 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
2fe70 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20  MAX_PATHNAME+2, 
2fe80 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
2fe90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fea0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2feb0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
2fec0 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
2fed0 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
2fee0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
2fef0 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79  enames are alway
2ff00 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  s double-zero te
2ff10 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20  rminated.    ** 
2ff20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74  for use by sqlit
2ff30 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
2ff40 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
2ff50 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  t( zName[strlen(
2ff60 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
2ff70 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
2ff80 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
2ff90 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2ffa0 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
2ffb0 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
2ffc0 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
2ffd0 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
2ffe0 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
2fff0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
30000 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
30010 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
30020 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
30030 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
30040 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
30050 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
30060 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
30070 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
30080 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
30090 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
300a0 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
300b0 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
300c0 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
300d0 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
300e0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
300f0 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
30100 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
30110 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
30120 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
30130 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
30140 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
30150 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
30160 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
30170 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
30180 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
30190 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
301a0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
301b0 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20   uid_t uid;     
301c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
301d0 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65  * Userid for the
301e0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64   file */.    gid
301f0 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20  _t gid;         
30200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72             /* Gr
30210 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69  oupid for the fi
30220 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
30230 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
30240 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
30250 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c  &openMode, &uid,
30260 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20   &gid);.    if( 
30270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30280 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
30290 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20  p->pUnused );.  
302a0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
302b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
302c0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
302d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
302e0 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72  URNAL );.      r
302f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
30300 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
30310 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
30320 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
30330 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
30340 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
30350 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
30360 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
30370 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
30380 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
30390 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
303a0 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
303b0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
303c0 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
303d0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
303e0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
303f0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
30400 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
30410 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
30420 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
30430 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
30440 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
30450 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
30460 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
30470 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
30480 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
30490 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
304a0 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
304b0 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72   1;.      fd = r
304c0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
304d0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
304e0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
304f0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
30500 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
30510 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
30520 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
30530 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
30540 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
30550 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  shed;.    }..   
30560 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
30570 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
30580 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72  s root and if cr
30590 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c  eating a new rol
305a0 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
305b0 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65  rnal or WAL file
305c0 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73  , set the owners
305d0 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  hip of the journ
305e0 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a  al or WAL to be.
305f0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
30600 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
30610 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
30620 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
30630 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
30640 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
30650 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
30660 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 66 64       osFchown(fd
30670 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20  , uid, gid);.   
30680 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
30690 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20   fd>=0 );.  if( 
306a0 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
306b0 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c   *pOutFlags = fl
306c0 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
306d0 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  p->pUnused ){.  
306e0 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64    p->pUnused->fd
306f0 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55   = fd;.    p->pU
30700 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66  nused->flags = f
30710 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
30720 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
30730 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
30740 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23  zPath = zName;.#
30750 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
30760 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52  ITE_UNLINK_AFTER
30770 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61 74  _CLOSE).    zPat
30780 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  h = sqlite3_mpri
30790 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29  ntf("%s", zName)
307a0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d  ;.    if( zPath=
307b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75  =0 ){.      robu
307c0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
307d0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
307e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
307f0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  OMEM;.    }.#els
30800 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  e.    osUnlink(z
30810 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
30820 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
30830 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
30840 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
30850 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
30860 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
30870 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  if..  noLock = e
30880 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
30890 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23  N_MAIN_DB;..  .#
308a0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
308b0 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
308c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
308d0 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74  TYLE.  if( fstat
308e0 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
308f0 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f  == -1 ){.    sto
30900 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20 65  reLastErrno(p, e
30910 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73  rrno);.    robus
30920 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
30930 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65  _LINE__);.    re
30940 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
30950 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20  R_ACCESS;.  }.  
30960 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
30970 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f  ("msdos", fsInfo
30980 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
30990 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
309a0 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
309b0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
309c0 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
309d0 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
309e0 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c  strncmp("exfat",
309f0 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
30a00 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
30a10 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
30a20 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53  e)->fsFlags |= S
30a30 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
30a40 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64  _MSDOS;.  }.#end
30a50 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  if..  /* Set up 
30a60 61 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c  appropriate ctrl
30a70 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69  Flags */.  if( i
30a80 73 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20  sDelete )       
30a90 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
30aa0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
30ab0 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52  ELETE;.  if( isR
30ac0 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20  eadonly )       
30ad0 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
30ae0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f   |= UNIXFILE_RDO
30af0 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  NLY;.  if( noLoc
30b00 6b 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  k )             
30b10 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
30b20 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
30b30 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72  K;.  if( syncDir
30b40 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
30b50 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
30b60 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
30b70 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
30b80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
30b90 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ) ctrlFlags |= U
30ba0 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69  NIXFILE_URI;..#i
30bb0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
30bc0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69  LOCKING_STYLE.#i
30bd0 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
30be0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20  PROXY_LOCKING.  
30bf0 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b  isAutoProxy = 1;
30c00 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73  .#endif.  if( is
30c10 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50  AutoProxy && (zP
30c20 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21  ath!=NULL) && (!
30c30 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d  noLock) && pVfs-
30c40 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68  >xOpen ){.    ch
30c50 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67  ar *envforce = g
30c60 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f  etenv("SQLITE_FO
30c70 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
30c80 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65  G");.    int use
30c90 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Proxy = 0;..    
30ca0 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  /* SQLITE_FORCE_
30cb0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31  PROXY_LOCKING==1
30cc0 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77   means force alw
30cd0 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30  ays use proxy, 0
30ce0 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e   means .    ** n
30cf0 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20  ever use proxy, 
30d00 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70  NULL means use p
30d10 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63  roxy for non-loc
30d20 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20  al files only.  
30d30 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
30d40 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
30d50 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
30d60 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
30d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30d80 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73   useProxy = !(fs
30d90 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
30da0 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  _LOCAL);.    }. 
30db0 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20     if( useProxy 
30dc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  ){.      rc = fi
30dd0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
30de0 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  s, fd, pFile, zP
30df0 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b  ath, ctrlFlags);
30e00 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
30e10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30e20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
30e30 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
30e40 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
30e50 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
30e60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30e80 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
30e90 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
30ea0 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
30eb0 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
30ec0 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
30ed0 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
30ee0 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
30ef0 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
30f00 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
30f10 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
30f20 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
30f30 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
30f40 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
30f50 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
30f60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30f70 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
30f80 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
30f90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30fa0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30fb0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
30fc0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
30fd0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
30fe0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
30ff0 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c  pVfs, fd, pFile,
31000 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67   zPath, ctrlFlag
31010 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  s);..open_finish
31020 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
31030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
31040 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
31050 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
31060 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
31070 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
31080 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
31090 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
310a0 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
310b0 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
310c0 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
310d0 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
310e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
310f0 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
31100 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31110 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
31120 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
31130 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
31140 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
31150 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
31160 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
31170 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
31180 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
31190 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
311a0 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
311b0 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
311c0 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
311d0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
311e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
311f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31200 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
31210 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
31220 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
31230 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
31240 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  osUnlink(zPath)=
31250 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28  =(-1) ){.    if(
31260 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23   errno==ENOENT.#
31270 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
31280 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73        || osAcces
31290 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65  s(zPath,0)!=0.#e
312a0 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
312b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
312c0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
312d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
312e0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
312f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
31300 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
31310 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
31320 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
31330 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
31340 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
31350 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79  YNC.  if( (dirSy
31360 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20  nc & 1)!=0 ){.  
31370 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63    int fd;.    rc
31380 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
31390 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
313a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
313b0 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f  TE_OK ){.#if OS_
313c0 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66  VXWORKS.      if
313d0 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20  ( fsync(fd)==-1 
313e0 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66  ).#else.      if
313f0 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65  ( fsync(fd) ).#e
31400 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
31410 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
31420 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
31430 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22  ERR_DIR_FSYNC, "
31440 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a  fsync", zPath);.
31450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f        }.      ro
31460 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
31470 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
31480 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
31490 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
314a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
314b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
314c0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
314d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
314e0 65 73 74 20 74 68 65 20 65 78 69 73 74 65 6e 63  est the existenc
314f0 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
31500 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
31510 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
31520 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
31530 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
31540 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
31550 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
31560 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
31570 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
31580 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
31590 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
315a0 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
315b0 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
315c0 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
315d0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
315e0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
315f0 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
31600 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
31610 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
31620 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
31630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
31640 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
31650 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31660 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
31670 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
31680 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
31690 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
316a0 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
316b0 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
316c0 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
316d0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
316e0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
316f0 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
31700 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
31710 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
31720 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
31730 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
31740 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
31750 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
31760 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55  amode = 0;.  UNU
31770 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31780 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
31790 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
317a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
317b0 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74  CCESS; );.  swit
317c0 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
317d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
317e0 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
317f0 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a    amode = F_OK;.
31800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31810 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
31820 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
31830 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f       amode = W_O
31840 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  K|R_OK;.      br
31850 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
31860 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
31870 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
31880 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
31890 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
318a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
318b0 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
318c0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
318d0 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63  *pResOut = (osAc
318e0 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64  cess(zPath, amod
318f0 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c  e)==0);.  if( fl
31900 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
31910 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52  SS_EXISTS && *pR
31920 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72  esOut ){.    str
31930 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
31940 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
31950 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20  zPath, &buf) && 
31960 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29  buf.st_size==0 )
31970 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74  {.      *pResOut
31980 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
31990 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
319a0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
319b0 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
319c0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
319d0 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
319e0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
319f0 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
31a00 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
31a10 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
31a20 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
31a30 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
31a40 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
31a50 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
31a60 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
31a70 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
31a80 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
31a90 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
31aa0 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
31ab0 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
31ac0 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
31ad0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
31ae0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
31af0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
31b00 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
31b10 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
31b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
31b30 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
31b40 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
31b50 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
31b60 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
31b70 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
31b80 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
31b90 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
31ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
31bb0 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
31bc0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
31bd0 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
31be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31bf0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
31c00 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
31c10 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
31c20 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
31c30 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
31c40 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
31c50 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
31c60 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
31c70 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
31c80 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
31c90 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
31ca0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
31cb0 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
31cc0 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
31cd0 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
31ce0 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
31cf0 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
31d00 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
31d10 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
31d20 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
31d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
31d40 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  R );..  assert( 
31d50 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
31d60 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
31d70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
31d80 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 2f  ETER(pVfs);..  /
31d90 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 73  * Attempt to res
31da0 6f 6c 76 65 20 74 68 65 20 70 61 74 68 20 61 73  olve the path as
31db0 20 69 66 20 69 74 20 77 65 72 65 20 61 20 73 79   if it were a sy
31dc0 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2e 20 49 66 20  mbolic link. If 
31dd0 69 74 20 69 73 0a 20 20 2a 2a 20 61 20 73 79 6d  it is.  ** a sym
31de0 62 6f 6c 69 63 20 6c 69 6e 6b 2c 20 74 68 65 20  bolic link, the 
31df0 72 65 73 6f 6c 76 65 64 20 70 61 74 68 20 69 73  resolved path is
31e00 20 73 74 6f 72 65 64 20 69 6e 20 62 75 66 66 65   stored in buffe
31e10 72 20 7a 4f 75 74 5b 5d 2e 20 4f 72 2c 20 69 66  r zOut[]. Or, if
31e20 0a 20 20 2a 2a 20 74 68 65 20 69 64 65 6e 74 69  .  ** the identi
31e30 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e 6f 74  fied file is not
31e40 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b   a symbolic link
31e50 20 6f 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   or does not exi
31e60 73 74 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 7a 50  st, then.  ** zP
31e70 61 74 68 20 69 73 20 63 6f 70 69 65 64 20 64 69  ath is copied di
31e80 72 65 63 74 6c 79 20 69 6e 74 6f 20 7a 4f 75 74  rectly into zOut
31e90 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 6e 42  . Either way, nB
31ea0 79 74 65 20 69 73 20 6c 65 66 74 20 73 65 74 20  yte is left set 
31eb0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  to.  ** the size
31ec0 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 63   of the string c
31ed0 6f 70 69 65 64 20 69 6e 74 6f 20 7a 4f 75 74 5b  opied into zOut[
31ee0 5d 20 69 6e 20 62 79 74 65 73 2e 20 20 2a 2f 0a  ] in bytes.  */.
31ef0 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61 64    nByte = osRead
31f00 6c 69 6e 6b 28 7a 50 61 74 68 2c 20 7a 4f 75 74  link(zPath, zOut
31f10 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 69 66 28  , nOut-1);.  if(
31f20 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20 20 20   nByte<0 ){.    
31f30 69 66 28 20 65 72 72 6e 6f 21 3d 45 49 4e 56 41  if( errno!=EINVA
31f40 4c 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45  L && errno!=ENOE
31f50 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  NT ){.      retu
31f60 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
31f70 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
31f80 42 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22  BKPT, "readlink"
31f90 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
31fa0 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d      zOut[nOut-1]
31fb0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 73 71 6c   = '\0';.    sql
31fc0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
31fd0 75 74 2d 31 2c 20 7a 4f 75 74 2c 20 22 25 73 22  ut-1, zOut, "%s"
31fe0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 6e 42  , zPath);.    nB
31ff0 79 74 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  yte = sqlite3Str
32000 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 7d  len30(zOut);.  }
32010 65 6c 73 65 7b 0a 20 20 20 20 7a 4f 75 74 5b 6e  else{.    zOut[n
32020 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  Byte] = '\0';.  
32030 7d 0a 0a 20 20 2f 2a 20 49 66 20 62 75 66 66 65  }..  /* If buffe
32040 72 20 7a 4f 75 74 5b 5d 20 6e 6f 77 20 63 6f 6e  r zOut[] now con
32050 74 61 69 6e 73 20 61 6e 20 61 62 73 6f 6c 75 74  tains an absolut
32060 65 20 70 61 74 68 20 74 68 65 72 65 20 69 73 20  e path there is 
32070 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 0a 20 20 2a  nothing more.  *
32080 2a 20 74 6f 20 64 6f 2e 20 49 66 20 69 74 20 63  * to do. If it c
32090 6f 6e 74 61 69 6e 73 20 61 20 72 65 6c 61 74 69  ontains a relati
320a0 76 65 20 70 61 74 68 2c 20 64 6f 20 74 68 65 20  ve path, do the 
320b0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
320c0 20 20 2a 2a 20 20 20 2a 20 6d 6f 76 65 20 74 68    **   * move th
320d0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
320e0 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 69  string so that i
320f0 74 20 69 73 20 61 74 20 74 68 65 20 65 6e 64 20  t is at the end 
32100 6f 66 20 74 68 0a 20 20 2a 2a 20 20 20 20 20 7a  of th.  **     z
32110 4f 75 74 5b 5d 20 62 75 66 66 65 72 2e 0a 20 20  Out[] buffer..  
32120 2a 2a 20 20 20 2a 20 43 61 6c 6c 20 67 65 74 63  **   * Call getc
32130 77 64 28 29 20 74 6f 20 72 65 61 64 20 74 68 65  wd() to read the
32140 20 70 61 74 68 20 6f 66 20 74 68 65 20 63 75 72   path of the cur
32150 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
32160 65 63 74 6f 72 79 20 0a 20 20 2a 2a 20 20 20 20  ectory .  **    
32170 20 69 6e 74 6f 20 74 68 65 20 73 74 61 72 74 20   into the start 
32180 6f 66 20 74 68 65 20 7a 4f 75 74 5b 5d 20 62 75  of the zOut[] bu
32190 66 66 65 72 2e 0a 20 20 2a 2a 20 20 20 2a 20 41  ffer..  **   * A
321a0 70 70 65 6e 64 20 61 20 27 2f 27 20 63 68 61 72  ppend a '/' char
321b0 61 63 74 65 72 20 74 6f 20 74 68 65 20 63 77 64  acter to the cwd
321c0 20 73 74 72 69 6e 67 20 61 6e 64 20 6d 6f 76 65   string and move
321d0 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20 20 72   the .  **     r
321e0 65 6c 61 74 69 76 65 20 70 61 74 68 20 62 61 63  elative path bac
321f0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66  k within the buf
32200 66 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 69  fer so that it i
32210 6d 6d 65 64 69 61 74 65 6c 79 20 0a 20 20 2a 2a  mmediately .  **
32220 20 20 20 20 20 66 6f 6c 6c 6f 77 73 20 74 68 65       follows the
32230 20 27 2f 27 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   '/'..  **.  ** 
32240 54 68 69 73 20 63 6f 64 65 20 69 73 20 77 72 69  This code is wri
32250 74 74 65 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tten so that if 
32260 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
32270 6f 66 20 74 68 65 20 43 57 44 20 61 6e 64 20 72  of the CWD and r
32280 65 6c 61 74 69 76 65 0a 20 20 2a 2a 20 70 61 74  elative.  ** pat
32290 68 20 61 72 65 20 6c 61 72 67 65 72 20 74 68 61  h are larger tha
322a0 6e 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  n the allocated 
322b0 73 69 7a 65 20 6f 66 20 7a 4f 75 74 5b 5d 20 74  size of zOut[] t
322c0 68 65 20 43 57 44 20 69 73 20 73 69 6c 65 6e 74  he CWD is silent
322d0 6c 79 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  ly.  ** truncate
322e0 64 20 74 6f 20 6d 61 6b 65 20 69 74 20 66 69 74  d to make it fit
322f0 2e 20 54 68 69 73 20 69 73 20 4f 6b 2c 20 61 73  . This is Ok, as
32300 20 53 51 4c 69 74 65 20 72 65 66 75 73 65 73 20   SQLite refuses 
32310 74 6f 20 6f 70 65 6e 20 61 6e 79 0a 20 20 2a 2a  to open any.  **
32320 20 66 69 6c 65 20 66 6f 72 20 77 68 69 63 68 20   file for which 
32330 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
32340 74 75 72 6e 73 20 61 20 66 75 6c 6c 20 70 61 74  turns a full pat
32350 68 20 6c 61 72 67 65 72 20 74 68 61 6e 20 28 6e  h larger than (n
32360 4f 75 74 2d 38 29 0a 20 20 2a 2a 20 62 79 74 65  Out-8).  ** byte
32370 73 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  s in size.  */. 
32380 20 69 66 28 20 7a 4f 75 74 5b 30 5d 21 3d 27 2f   if( zOut[0]!='/
32390 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  ' ){.    int nCw
323a0 64 3b 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20  d;.    int nRem 
323b0 3d 20 6e 4f 75 74 2d 6e 42 79 74 65 2d 31 3b 0a  = nOut-nByte-1;.
323c0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 4f 75      memmove(&zOu
323d0 74 5b 6e 52 65 6d 5d 2c 20 7a 4f 75 74 2c 20 6e  t[nRem], zOut, n
323e0 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 7a 4f 75  Byte+1);.    zOu
323f0 74 5b 6e 52 65 6d 2d 31 5d 20 3d 20 27 5c 30 27  t[nRem-1] = '\0'
32400 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63  ;.    if( osGetc
32410 77 64 28 7a 4f 75 74 2c 20 6e 52 65 6d 2d 31 29  wd(zOut, nRem-1)
32420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
32430 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
32440 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
32450 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c  _BKPT, "getcwd",
32460 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
32470 20 20 20 6e 43 77 64 20 3d 20 73 71 6c 69 74 65     nCwd = sqlite
32480 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b  3Strlen30(zOut);
32490 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 77  .    assert( nCw
324a0 64 3c 3d 6e 52 65 6d 2d 31 20 29 3b 0a 20 20 20  d<=nRem-1 );.   
324b0 20 7a 4f 75 74 5b 6e 43 77 64 5d 20 3d 20 27 2f   zOut[nCwd] = '/
324c0 27 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26  ';.    memmove(&
324d0 7a 4f 75 74 5b 6e 43 77 64 2b 31 5d 2c 20 26 7a  zOut[nCwd+1], &z
324e0 4f 75 74 5b 6e 52 65 6d 5d 2c 20 6e 42 79 74 65  Out[nRem], nByte
324f0 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  +1);.  }..  retu
32500 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32510 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
32520 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
32530 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
32540 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
32550 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
32560 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
32570 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
32580 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
32590 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
325a0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
325b0 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
325c0 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
325d0 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
325e0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
325f0 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
32600 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
32610 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
32620 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32630 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
32640 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
32650 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
32660 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
32670 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
32680 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
32690 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
326a0 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
326b0 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
326c0 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
326d0 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
326e0 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
326f0 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
32700 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
32710 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
32720 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
32730 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
32740 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
32750 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
32760 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
32770 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
32780 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
32790 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
327a0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
327b0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
327c0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
327d0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
327e0 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Out){.  const ch
327f0 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53  ar *zErr;.  UNUS
32800 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
32810 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74  Used);.  unixEnt
32820 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72  erMutex();.  zEr
32830 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20  r = dlerror();. 
32840 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
32850 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32860 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c  f(nBuf, zBufOut,
32870 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20   "%s", zErr);.  
32880 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
32890 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ex();.}.static v
328a0 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28  oid (*unixDlSym(
328b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
328c0 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63  Used, void *p, c
328d0 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29  onst char*zSym))
328e0 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20  (void){.  /* .  
328f0 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64  ** GCC with -ped
32900 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79  antic-errors say
32910 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20  s that C90 does 
32920 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64  not allow a void
32930 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73  * to be.  ** cas
32940 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  t into a pointer
32950 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
32960 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62   And yet the lib
32970 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75  rary dlsym() rou
32980 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e  tine.  ** return
32990 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20  s a void* which 
329a0 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
329b0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
329c0 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65  n.  So how do we
329d0 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28  .  ** use dlsym(
329e0 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  ) with -pedantic
329f0 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20  -errors?.  **.  
32a00 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65  ** Variable x be
32a10 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74  low is defined t
32a20 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  o be a pointer t
32a30 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  o a function tak
32a40 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74  ing.  ** paramet
32a50 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f  ers void* and co
32a60 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65  nst char* and re
32a70 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65  turning a pointe
32a80 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
32a90 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c  .  ** We initial
32aa0 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69  ize x by assigni
32ab0 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20  ng it a pointer 
32ac0 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66  to the dlsym() f
32ad0 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54  unction..  ** (T
32ae0 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72  hat assignment r
32af0 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29  equires a cast.)
32b00 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74    Then we call t
32b10 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  he function that
32b20 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74  .  ** x points t
32b30 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  o.  .  **.  ** T
32b40 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
32b50 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77  is unlikely to w
32b60 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e  ork correctly on
32b70 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72   any system wher
32b80 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c  e.  ** you reall
32b90 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20  y cannot cast a 
32ba0 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
32bb0 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75   into void*.  Bu
32bc0 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20  t then, on the. 
32bd0 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20   ** other hand, 
32be0 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74  dlsym() will not
32bf0 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20   work on such a 
32c00 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73  system either, s
32c10 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e  o we have.  ** n
32c20 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61  ot really lost a
32c30 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  nything..  */.  
32c40 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64  void (*(*x)(void
32c50 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
32c60 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  void);.  UNUSED_
32c70 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
32c80 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28  d);.  x = (void(
32c90 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  *(*)(void*,const
32ca0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64   char*))(void))d
32cb0 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28  lsym;.  return (
32cc0 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  *x)(p, zSym);.}.
32cd0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
32ce0 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
32cf0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
32d00 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
32d10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32d20 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63  (NotUsed);.  dlc
32d30 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
32d40 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
32d50 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
32d60 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
32d70 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
32d80 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
32d90 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
32da0 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
32db0 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
32dc0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
32dd0 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
32de0 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
32df0 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
32e00 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
32e10 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
32e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32e30 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73  unixRandomness(s
32e40 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
32e50 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
32e60 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
32e70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32e80 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72  otUsed);.  asser
32e90 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d  t((size_t)nBuf>=
32ea0 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
32eb0 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
32ec0 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
32ed0 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
32ee0 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
32ef0 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
32f00 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
32f10 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
32f20 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
32f30 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
32f40 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
32f50 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
32f60 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
32f70 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
32f80 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
32f90 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
32fa0 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
32fb0 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
32fc0 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
32fd0 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
32fe0 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
32ff0 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
33000 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
33010 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
33020 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
33030 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
33040 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
33050 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
33060 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
33070 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
33080 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
33090 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
330a0 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
330b0 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
330c0 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
330d0 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
330e0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
330f0 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
33100 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
33110 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
33120 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
33130 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
33140 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61 6e   0, nBuf);.  ran
33150 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47  domnessPid = osG
33160 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69 66 20  etpid(0);  .#if 
33170 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
33180 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65  TEST) && !define
33190 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41  d(SQLITE_OMIT_RA
331a0 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20 20  NDOMNESS).  {.  
331b0 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20    int fd, got;. 
331c0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
331d0 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
331e0 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  m", O_RDONLY, 0)
331f0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
33200 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
33210 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
33220 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
33230 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
33240 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  t));.      memcp
33250 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74  y(&zBuf[sizeof(t
33260 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50  )], &randomnessP
33270 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f  id, sizeof(rando
33280 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20 20  mnessPid));.    
33290 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
332a0 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f  (t)+sizeof(rando
332b0 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a 65  mnessPid)<=(size
332c0 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
332d0 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
332e0 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f  ) + sizeof(rando
332f0 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20 7d  mnessPid);.    }
33300 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20  else{.      do{ 
33310 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c  got = osRead(fd,
33320 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77   zBuf, nBuf); }w
33330 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
33340 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
33350 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
33360 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
33370 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  _);.    }.  }.#e
33380 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42  ndif.  return nB
33390 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c  uf;.}.../*.** Sl
333a0 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
333b0 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
333c0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
333d0 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
333e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
333f0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
33400 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
33410 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65  to sleep..** The
33420 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
33430 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
33440 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73  icroseconds of s
33450 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  leep actually.**
33460 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
33470 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
33480 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c  perating system,
33490 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a   a number which.
334a0 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61  ** might be grea
334b0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
334c0 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e  l to the argumen
334d0 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a  t, but not less.
334e0 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75  ** than the argu
334f0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
33500 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71  int unixSleep(sq
33510 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
33520 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  ed, int microsec
33530 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58  onds){.#if OS_VX
33540 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
33550 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73  imespec sp;..  s
33560 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f  p.tv_sec = micro
33570 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30  seconds / 100000
33580 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20  0;.  sp.tv_nsec 
33590 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  = (microseconds 
335a0 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30  % 1000000) * 100
335b0 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26  0;.  nanosleep(&
335c0 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55  sp, NULL);.  UNU
335d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
335e0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
335f0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
33600 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  elif defined(HAV
33610 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
33620 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
33630 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  p(microseconds);
33640 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33650 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33660 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
33670 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  nds;.#else.  int
33680 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72   seconds = (micr
33690 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29  oseconds+999999)
336a0 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65  /1000000;.  slee
336b0 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  p(seconds);.  UN
336c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
336d0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
336e0 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
336f0 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
33700 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
33710 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
33720 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
33730 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
33740 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
33750 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
33760 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
33770 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
33780 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
33790 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
337a0 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
337b0 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
337c0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
337d0 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
337e0 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
337f0 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
33800 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
33810 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
33820 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
33830 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
33840 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
33850 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
33860 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
33870 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
33880 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
33890 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
338a0 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
338b0 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
338c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
338d0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
338e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
338f0 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
33900 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
33910 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
33920 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
33930 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
33940 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
33950 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
33960 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
33970 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
33980 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
33990 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
339a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
339b0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
339c0 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
339d0 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
339e0 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
339f0 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
33a00 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
33a10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
33a20 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20  iNow){.  static 
33a30 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
33a40 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
33a50 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
33a60 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
33a70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33a80 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e  TE_OK;.#if defin
33a90 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20  ed(NO_GETTOD).  
33aa0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
33ab0 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  (&t);.  *piNow =
33ac0 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
33ad0 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45  )t)*1000 + unixE
33ae0 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56  poch;.#elif OS_V
33af0 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
33b00 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
33b10 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
33b20 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
33b30 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  sNow);.  *piNow 
33b40 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
33b50 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
33b60 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
33b70 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30  sNow.tv_nsec/100
33b80 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  0000;.#else.  st
33b90 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
33ba0 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d 65  w;.  if( gettime
33bb0 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d  ofday(&sNow, 0)=
33bc0 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  =0 ){.    *piNow
33bd0 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
33be0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
33bf0 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
33c00 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30   sNow.tv_usec/10
33c10 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
33c20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
33c30 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OR;.  }.#endif..
33c40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33c50 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
33c60 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
33c70 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
33c80 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
33c90 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
33ca0 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
33cb0 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
33cc0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
33cd0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
33ce0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33cf0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
33d00 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
33d10 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
33d20 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
33d30 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
33d40 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
33d50 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
33d60 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
33d70 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
33d80 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
33d90 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
33da0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
33db0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
33dc0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
33dd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
33de0 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
33df0 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ow){.  sqlite3_i
33e00 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e  nt64 i = 0;.  in
33e10 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t rc;.  UNUSED_P
33e20 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33e30 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75  );.  rc = unixCu
33e40 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
33e50 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
33e60 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
33e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33e80 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74  /*.** We added t
33e90 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  he xGetLastError
33ea0 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74  () method with t
33eb0 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20  he intention of 
33ec0 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74  providing.** bet
33ed0 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72  ter low-level er
33ee0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65  ror messages whe
33ef0 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74  n operating-syst
33f00 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65  em problems come
33f10 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51   up.** during SQ
33f20 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Lite operation. 
33f30 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e   But so far, non
33f40 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65  e of that has be
33f50 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  en implemented.*
33f60 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20  * in the core.  
33f70 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  So this routine 
33f80 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
33f90 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73    For now, it is
33fa0 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61   merely.** a pla
33fb0 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74  ce-holder..*/.st
33fc0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
33fd0 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
33fe0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
33ff0 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68  int NotUsed2, ch
34000 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20  ar *NotUsed3){. 
34010 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34020 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e  R(NotUsed);.  UN
34030 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
34040 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53  otUsed2);.  UNUS
34050 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34060 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e  Used3);.  return
34070 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a   0;.}.../*.*****
34080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34090 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74  *** End of sqlit
340a0 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
340b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
340d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
34120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
34170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34180 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f  ****** Begin Pro
34190 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  xy Locking *****
341a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
341b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
341c0 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
341d0 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69  is a "uber-locki
341e0 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  ng-method" in th
341f0 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73  is sense:  It us
34200 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  es the.** other 
34210 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
34220 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63  on secondary loc
34230 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20  k files.  Proxy 
34240 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20  locking is a.** 
34250 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20  meta-layer over 
34260 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69  top of the primi
34270 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  tive locking imp
34280 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20  lemented above. 
34290 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61   For.** this rea
342a0 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
342b0 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
342c0 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s of proxy locki
342d0 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a  ng is deferred.*
342e0 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20  * until late in 
342f0 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20  the file (here) 
34300 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
34310 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f   other I/O metho
34320 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  ds have.** been 
34330 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61  defined - so tha
34340 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  t the primitive 
34350 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
34360 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  are available.**
34370 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20   as services to 
34380 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d  help with the im
34390 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
343a0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
343b0 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  *.****.**.** The
343c0 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
343d0 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69   schemes in SQLi
343e0 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67  te use byte-rang
343f0 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a  e locks on the.*
34400 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
34410 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61  to coordinate sa
34420 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61  fe, concurrent a
34430 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
34440 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64  e readers.** and
34450 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f   writers [http:/
34460 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b  /sqlite.org/lock
34470 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68  ingv3.html].  Th
34480 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b  e five file lock
34490 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55  ing.** states (U
344a0 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47  NLOCKED, PENDING
344b0 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
344c0 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61  ED, EXCLUSIVE) a
344d0 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  re implemented.*
344e0 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20  * as POSIX read 
344f0 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76  & write locks ov
34500 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20  er fixed set of 
34510 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66  locations (via f
34520 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50  sctl),.** on AFP
34530 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78   and SMB only ex
34540 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
34550 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61  ge locks are ava
34560 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c  ilable via fsctl
34570 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27  .** with _IOWR('
34580 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
34590 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
345a0 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61   to track the sa
345b0 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20  me 5 states..** 
345c0 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f  To simulate a F_
345d0 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61  RDLCK on the sha
345e0 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46  red range, on AF
345f0 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  P a randomly sel
34600 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73  ected.** address
34610 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   in the shared r
34620 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
34630 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  r a SHARED lock,
34640 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73   the entire.** s
34650 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
34660 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c  aken for an EXCL
34670 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a  USIVE lock):.**.
34680 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f  **      PENDING_
34690 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30  BYTE        0x40
346a0 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52  000000.**      R
346b0 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
346c0 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
346d0 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
346e0 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
346f0 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
34700 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
34710 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
34720 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
34730 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
34740 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
34750 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
34760 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
34770 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
34780 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
34790 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
347a0 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
347b0 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
347c0 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
347d0 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
347e0 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
347f0 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
34800 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
34810 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
34820 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
34830 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
34840 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
34850 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
34860 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
34870 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
34880 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
34890 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
348a0 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
348b0 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
348c0 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
348d0 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
348e0 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
348f0 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
34900 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
34910 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
34920 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
34930 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
34940 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
34950 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
34960 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
34970 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
34980 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
34990 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
349a0 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
349b0 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
349c0 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
349d0 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
349e0 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
349f0 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
34a00 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
34a10 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
34a20 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
34a30 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
34a40 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
34a50 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
34a60 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
34a70 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
34a80 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
34a90 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
34aa0 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
34ab0 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
34ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
34ad0 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
34ae0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
34af0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
34b00 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
34b10 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
34b20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
34b30 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79            <proxy
34b40 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a  _path> | ":auto:
34b50 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  ");.**  sqlite3_
34b60 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
34b70 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
34b80 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52  FCNTL_GET_LOCKPR
34b90 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
34ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bb0 20 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29    &<proxy_path>)
34bc0 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
34bd0 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
34be0 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
34bf0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
34c00 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
34c10 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
34c20 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
34c30 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
34c40 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
34c50 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
34c60 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
34c70 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
34c80 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
34c90 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
34ca0 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
34cb0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
34cc0 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
34cd0 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
34ce0 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
34cf0 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
34d00 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
34d10 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
34d20 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
34d30 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
34d40 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
34d50 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
34d60 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
34d70 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
34d80 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
34d90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
34da0 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
34db0 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
34dc0 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
34dd0 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
34de0 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
34df0 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
34e00 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
34e10 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
34e20 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
34e30 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
34e40 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
34e50 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
34e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
34e70 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
34e80 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
34e90 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
34ea0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
34eb0 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
34ec0 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
34ed0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
34ee0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
34ef0 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
34f00 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
34f10 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
34f20 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
34f30 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
34f40 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
34f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
34f60 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
34f70 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
34f80 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
34f90 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
34fa0 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
34fb0 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
34fc0 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
34fd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34fe0 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
34ff0 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
35000 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
35010 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
35020 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
35030 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
35040 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
35050 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
35060 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
35070 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
35080 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
35090 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
350a0 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
350b0 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
350c0 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
350d0 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
350e0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
350f0 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
35100 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
35110 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
35120 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
35130 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
35140 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
35150 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
35160 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
35170 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
35180 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
35190 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
351a0 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
351b0 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
351c0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
351d0 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
351e0 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
351f0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
35200 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
35210 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
35220 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
35230 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
35240 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 73  ot exist, or its
35250 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
35260 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
35270 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
35280 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
35290 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
352a0 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
352b0 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
352c0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
352d0 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
352e0 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
352f0 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
35300 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
35310 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
35320 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
35330 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
35340 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
35350 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
35360 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
35370 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
35380 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
35390 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
353a0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
353b0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
353c0 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
353d0 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
353e0 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
353f0 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
35400 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
35410 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
35420 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
35430 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
35440 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
35450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35460 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
35470 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
35480 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
35490 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
354a0 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
354b0 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
354c0 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
354d0 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
354e0 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
354f0 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
35500 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
35510 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
35520 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
35530 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
35540 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
35550 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
35560 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
35570 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
35580 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
35590 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
355a0 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
355b0 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
355c0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
355d0 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
355e0 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
355f0 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
35600 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
35610 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
35620 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
35630 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
35640 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
35650 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
35660 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
35670 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
35680 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
35690 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
356a0 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
356b0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
356c0 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
356d0 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
356e0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
356f0 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
35700 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
35710 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
35720 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
35730 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
35740 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
35750 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
35760 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
35770 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
35780 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
35790 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
357a0 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
357b0 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
357c0 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
357d0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
357e0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
357f0 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
35800 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
35810 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
35820 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
35830 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
35840 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
35850 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
35860 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
35870 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
35880 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
35890 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
358a0 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
358b0 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
358c0 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
358d0 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
358e0 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
358f0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
35900 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
35910 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
35920 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
35930 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
35940 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
35950 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
35960 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
35970 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
35980 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
35990 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
359a0 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
359b0 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
359c0 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
359d0 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
359e0 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
359f0 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
35a00 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
35a10 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
35a20 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
35a30 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
35a40 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
35a50 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
35a60 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
35a70 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
35a80 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
35a90 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
35aa0 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
35ab0 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
35ac0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
35ad0 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
35ae0 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
35af0 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
35b00 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
35b10 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
35b20 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
35b30 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68  citly calling th
35b40 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
35b50 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
35b60 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71   pragma or.** sq
35b70 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  lite_file_contro
35b80 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66  l API is not aff
35b90 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f  ected by SQLITE_
35ba0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
35bb0 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ING)..*/../*.** 
35bc0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
35bd0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
35be0 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69  on MacOSX .*/.#i
35bf0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
35c00 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
35c10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
35c20 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  YLE../*.** The p
35c30 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35c40 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20  xt has the path 
35c50 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75  and file structu
35c60 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f  res for the remo
35c70 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c  te .** and local
35c80 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20   proxy files in 
35c90 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  it.*/.typedef st
35ca0 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
35cb0 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f  gContext proxyLo
35cc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
35cd0 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
35ce0 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69  gContext {.  uni
35cf0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
35d00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
35d10 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  n conch file */.
35d20 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c    char *conchFil
35d30 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  ePath;         /
35d40 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
35d50 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  nch file */.  un
35d60 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
35d70 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  y;         /* Op
35d80 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  en proxy lock fi
35d90 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
35da0 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20  ckProxyPath;    
35db0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
35dc0 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
35dd0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  ile */.  char *d
35de0 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
35df0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
35e00 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
35e10 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c  /.  int conchHel
35e20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
35e30 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e   /* 1 if the con
35e40 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69  ch is held, -1 i
35e50 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  f lockless */.  
35e60 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20 20 20  int nFails;     
35e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35e80 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63 68 20  Number of conch 
35e90 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65 73 20  taking failures 
35ea0 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
35eb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
35ec0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
35ed0 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
35ee0 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
35ef0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
35f00 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
35f10 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
35f20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
35f30 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
35f40 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
35f50 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
35f60 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
35f70 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
35f80 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
35f90 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
35fa0 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
35fb0 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
35fc0 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
35fd0 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
35fe0 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
35ff0 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
36000 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
36010 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
36020 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
36030 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
36040 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
36050 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
36060 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
36070 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
36080 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
36090 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
360a0 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
360b0 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
360c0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
360d0 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
360e0 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
360f0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
36100 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
36110 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
36120 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
36130 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
36140 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
36150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36160 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 6f 73  lPath, errno, os
36170 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20  Getpid(0)));.   
36180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36190 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
361a0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
361b0 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
361c0 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
361d0 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
361e0 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
361f0 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
36200 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
36210 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
36220 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
36230 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
36240 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
36250 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
36260 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
36270 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
36280 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
36290 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
362a0 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
362b0 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
362c0 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
362d0 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
362e0 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
362f0 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
36300 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
36310 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
36320 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
36330 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
36340 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
36350 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
36360 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
36370 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
36380 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
36390 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
363a0 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  th, osGetpid(0))
363b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
363c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a  TE_OK;.}../* . *
363d0 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f  * Creates the lo
363e0 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20  ck file and any 
363f0 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72  missing director
36400 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a  ies in lockPath.
36410 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
36420 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
36430 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  th(const char *l
36440 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20  ockPath){.  int 
36450 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62  i, len;.  char b
36460 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  uf[MAXPATHLEN];.
36470 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b    int start = 0;
36480 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63  .  .  assert(loc
36490 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20  kPath!=NULL);.  
364a0 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  /* try to create
364b0 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65   all the interme
364c0 64 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65  diate directorie
364d0 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e  s */.  len = (in
364e0 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74  t)strlen(lockPat
364f0 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c  h);.  buf[0] = l
36500 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f  ockPath[0];.  fo
36510 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69  r( i=1; i<len; i
36520 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  ++ ){.    if( lo
36530 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27  ckPath[i] == '/'
36540 20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e   && (i - start >
36550 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
36560 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65  only mkdir if le
36570 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72  af dir != "." or
36580 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a   "/" or ".." */.
36590 20 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72        if( i-star
365a0 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d  t>2 || (i-start=
365b0 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =1 && buf[start]
365c0 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
365d0 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20  tart] != '/') . 
365e0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74          || (i-st
365f0 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74  art==2 && buf[st
36600 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
36610 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27  uf[start+1] != '
36620 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  .') ){.        b
36630 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20  uf[i]='\0';.    
36640 20 20 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28      if( osMkdir(
36650 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  buf, SQLITE_DEFA
36660 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
36670 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20  MISSIONS) ){.   
36680 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65         int err=e
36690 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
366a0 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20  if( err!=EEXIST 
366b0 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
366c0 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
366d0 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44  LOCKPATH  FAILED
366e0 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a   creating %s, ".
366f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36700 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79       "'%s' proxy
36710 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
36720 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
36730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
36740 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29  f, strerror(err)
36750 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65  , lockPath, osGe
36760 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20 20 20  tpid(0)));.     
36770 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72         return er
36780 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
36790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
367a0 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31  .      start=i+1
367b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b  ;.    }.    buf[
367c0 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d  i] = lockPath[i]
367d0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
367e0 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
367f0 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
36800 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 6c  h=%s pid=%d\n",l
36810 6f 63 6b 50 61 74 68 2c 6f 73 47 65 74 70 69 64  ockPath,osGetpid
36820 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (0)));.  return 
36830 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
36840 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
36850 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
36860 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
36870 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
36880 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
36890 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
368a0 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
368b0 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
368c0 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
368d0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
368e0 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
368f0 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
36900 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
36910 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
36920 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
36930 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
36940 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
36950 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
36960 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
36970 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
36980 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
36990 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
369a0 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
369b0 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
369c0 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
369d0 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
369e0 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
369f0 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
36a00 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
36a10 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
36a20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
36a30 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
36a40 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
36a50 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
36a60 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
36a70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36a80 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65  TE_OK;.  int ope
36a90 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
36aa0 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c  | O_CREAT;.  sql
36ab0 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66  ite3_vfs dummyVf
36ac0 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20  s;.  int terrno 
36ad0 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
36ae0 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e  dFd *pUnused = N
36af0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69  ULL;..  /* 1. fi
36b00 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f  rst try to open/
36b10 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a  create the file.
36b20 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20    ** 2. if that 
36b30 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20  fails, and this 
36b40 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28  is a lock file (
36b50 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20  not-conch), try 
36b60 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
36b70 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
36b80 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72  ries and then tr
36b90 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e  y again..  ** 3.
36ba0 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
36bb0 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  try to open the 
36bc0 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20  file read-only. 
36bd0 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65   ** otherwise re
36be0 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f  turn BUSY (if lo
36bf0 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54  ck file) or CANT
36c00 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e  OPEN for the con
36c10 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70  ch file.  */.  p
36c20 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
36c30 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70  sableFd(path, op
36c40 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
36c50 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66  pUnused ){.    f
36c60 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
36c70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55  .  }else{.    pU
36c80 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
36c90 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28  malloc64(sizeof(
36ca0 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
36cb0 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
36cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36cd0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
36ce0 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
36cf0 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
36d00 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
36d10 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
36d20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
36d30 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
36d40 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
36d50 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
36d60 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
36d70 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
36d80 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
36d90 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
36da0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
36db0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
36dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36dd0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
36de0 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
36df0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
36e00 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
36e10 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
36e20 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
36e30 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
36e40 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
36e50 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29  if( islockfile )
36e60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
36e70 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
36e80 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65  }.    switch (te
36e90 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61  rrno) {.      ca
36ea0 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20  se EACCES:.     
36eb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36ec0 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73  _PERM;.      cas
36ed0 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20  e EIO: .        
36ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
36ef0 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65  ERR_LOCK; /* eve
36f00 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74  n though it is t
36f10 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20  he conch */.    
36f20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
36f30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36f40 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
36f50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70      }.  }.  .  p
36f60 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
36f70 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
36f80 36 34 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  64(sizeof(*pNew)
36f90 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  );.  if( pNew==N
36fa0 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
36fb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
36fc0 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74    goto end_creat
36fd0 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d  e_proxy;.  }.  m
36fe0 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
36ff0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
37000 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c  ;.  pNew->openFl
37010 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
37020 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79  .  memset(&dummy
37030 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  Vfs, 0, sizeof(d
37040 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d  ummyVfs));.  dum
37050 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d  myVfs.pAppData =
37060 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63   (void*)&autoloc
37070 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d  kIoFinder;.  dum
37080 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64  myVfs.zName = "d
37090 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64  ummy";.  pUnused
370a0 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e  ->fd = fd;.  pUn
370b0 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70  used->flags = op
370c0 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  enFlags;.  pNew-
370d0 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
370e0 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  ed;.  .  rc = fi
370f0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75  llInUnixFile(&du
37100 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c  mmyVfs, fd, (sql
37110 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
37120 20 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28   path, 0);.  if(
37130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37140 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
37150 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
37160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
37170 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
37180 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63  :    .  robust_c
37190 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f  lose(pNew, fd, _
371a0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69  _LINE__);.  sqli
371b0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
371c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
371d0 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72  Unused);.  retur
371e0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
371f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73  SQLITE_TEST./* s
37200 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
37210 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
37220 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
37230 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69   file paths */.i
37240 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
37250 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  d_num = 0;.#endi
37260 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  f..#define PROXY
37270 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36  _HOSTIDLEN    16
37280 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
37290 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a  host id length *
372a0 2f 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47  /..#ifdef HAVE_G
372b0 45 54 48 4f 53 54 55 55 49 44 0a 2f 2a 20 4e 6f  ETHOSTUUID./* No
372c0 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64  t always defined
372d0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 73 20   in the headers 
372e0 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  as it ought to b
372f0 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20  e */.extern int 
37300 67 65 74 68 6f 73 74 75 75 69 64 28 75 75 69 64  gethostuuid(uuid
37310 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72  _t id, const str
37320 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61  uct timespec *wa
37330 69 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  it);.#endif../* 
37340 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20  get the host ID 
37350 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28  via gethostuuid(
37360 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20  ), pHostID must 
37370 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48  point to PROXY_H
37380 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74  OSTIDLEN .** byt
37390 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d  es of writable m
373a0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
373b0 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73   int proxyGetHos
373c0 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61  tID(unsigned cha
373d0 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20  r *pHostID, int 
373e0 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65  *pError){.  asse
373f0 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  rt(PROXY_HOSTIDL
37400 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69  EN == sizeof(uui
37410 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  d_t));.  memset(
37420 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58  pHostID, 0, PROX
37430 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69  Y_HOSTIDLEN);.#i
37440 66 64 65 66 20 48 41 56 45 5f 47 45 54 48 4f 53  fdef HAVE_GETHOS
37450 54 55 55 49 44 0a 20 20 7b 0a 20 20 20 20 73 74  TUUID.  {.    st
37460 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
37470 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
37480 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
37490 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68   */.    if( geth
374a0 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c  ostuuid(pHostID,
374b0 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20   &timeout) ){.  
374c0 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
374d0 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rno;.      if( p
374e0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
374f0 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
37500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
37510 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
37520 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
37530 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
37540 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23  METER(pError);.#
37550 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
37560 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69  ITE_TEST.  /* si
37570 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
37580 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
37590 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
375a0 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20  file paths */.  
375b0 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  if( sqlite3_host
375c0 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20  id_num != 0){.  
375d0 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28    pHostID[0] = (
375e0 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d  char)(pHostID[0]
375f0 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65   + (char)(sqlite
37600 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30  3_hostid_num & 0
37610 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xFF));.  }.#endi
37620 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  f.  .  return SQ
37630 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
37640 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
37650 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65  ntains the heade
37660 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c  r, host id and l
37670 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a  ock file path. *
37680 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
37690 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20  CONCHVERSION 2  
376a0 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65   /* 1-byte heade
376b0 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20  r, 16-byte host 
376c0 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66  id, path */.#def
376d0 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52  ine PROXY_HEADER
376e0 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f  LEN    1   /* co
376f0 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20  nch file header 
37700 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e  length */.#defin
37710 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  e PROXY_PATHINDE
37720 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44  X    (PROXY_HEAD
37730 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
37740 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50  IDLEN).#define P
37750 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
37760 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c    (PROXY_HEADERL
37770 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
37780 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a  EN+MAXPATHLEN)..
37790 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  /* .** Takes an 
377a0 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c  open conch file,
377b0 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74   copies the cont
377c0 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61  ents to a new pa
377d0 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65  th and then move
377e0 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20  s .** it back.  
377f0 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65  The newly create
37800 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65  d file's file de
37810 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69  scriptor is assi
37820 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63  gned to the.** c
37830 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74  onch file struct
37840 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  ure and finally 
37850 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
37860 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
37870 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64  or is .** closed
37880 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20  .  Returns zero 
37890 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
378a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
378b0 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
378c0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
378d0 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
378e0 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  D){.  proxyLocki
378f0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
37900 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
37910 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
37920 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
37930 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
37940 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
37950 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72  onchFile;.  char
37960 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45   tPath[MAXPATHLE
37970 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50  N];.  char buf[P
37980 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
37990 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68  ];.  char *cPath
379a0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
379b0 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74  lePath;.  size_t
379c0 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
379d0 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
379e0 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73   0;.  char errms
379f0 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e  g[64] = "";.  in
37a00 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  t fd = -1;.  int
37a10 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53   rc = -1;.  UNUS
37a20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48  ED_PARAMETER(myH
37a30 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72  ostID);..  /* cr
37a40 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20  eate a new path 
37a50 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74  by replace the t
37a60 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27  railing '-conch'
37a70 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a   with '-break' *
37a80 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74  /.  pathLen = st
37a90 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61  rlcpy(tPath, cPa
37aa0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
37ab0 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d  .  if( pathLen>M
37ac0 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74  AXPATHLEN || pat
37ad0 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20  hLen<6 || .     
37ae0 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b  (strlcpy(&tPath[
37af0 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65  pathLen-5], "bre
37b00 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b  ak", 6) != 5) ){
37b10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
37b20 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
37b30 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74  msg),errmsg,"pat
37b40 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  h error (len %d)
37b50 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b  ",(int)pathLen);
37b60 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
37b70 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
37b80 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68  * read the conch
37b90 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65   content */.  re
37ba0 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  adLen = osPread(
37bb0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75  conchFile->h, bu
37bc0 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
37bd0 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20  HLEN, 0);.  if( 
37be0 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41  readLen<PROXY_PA
37bf0 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73  THINDEX ){.    s
37c00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
37c10 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
37c20 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f  rrmsg,"read erro
37c30 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
37c40 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67  )readLen);.    g
37c50 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
37c60 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74  k;.  }.  /* writ
37c70 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20  e it out to the 
37c80 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20  temporary break 
37c90 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72  file */.  fd = r
37ca0 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68  obust_open(tPath
37cb0 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  , (O_RDWR|O_CREA
37cc0 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20  T|O_EXCL), 0);. 
37cd0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
37ce0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
37cf0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
37d00 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74  , errmsg, "creat
37d10 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
37d20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
37d30 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
37d40 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69    }.  if( osPwri
37d50 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64  te(fd, buf, read
37d60 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a  Len, 0) != (ssiz
37d70 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20  e_t)readLen ){. 
37d80 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37d90 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
37da0 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69  g), errmsg, "wri
37db0 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
37dc0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
37dd0 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
37de0 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d  .  }.  if( renam
37df0 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20  e(tPath, cPath) 
37e00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
37e10 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
37e20 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
37e30 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28  "rename failed (
37e40 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
37e50 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
37e60 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  lock;.  }.  rc =
37e70 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74   0;.  fprintf(st
37e80 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61  derr, "broke sta
37e90 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22  le lock on %s\n"
37ea0 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75  , cPath);.  robu
37eb0 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
37ec0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f  conchFile->h, __
37ed0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68  LINE__);.  conch
37ee0 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
37ef0 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
37f00 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
37f10 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
37f20 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
37f30 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
37f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  =0 ){.      osUn
37f50 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20  link(tPath);.   
37f60 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
37f70 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e  pFile, fd, __LIN
37f80 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E__);.    }.    
37f90 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
37fa0 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b  "failed to break
37fb0 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
37fc0 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c  s, %s\n", cPath,
37fd0 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20   errmsg);.  }.  
37fe0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37ff0 20 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73   Take the reques
38000 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ted lock on the 
38010 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62  conch file and b
38020 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63  reak a stale loc
38030 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  k if the .** hos
38040 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f  t id matches..*/
38050 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
38060 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  yConchLock(unixF
38070 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
38080 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74  _t myHostID, int
38090 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72   lockType){.  pr
380a0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
380b0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
380c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
380d0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
380e0 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46  ontext; .  unixF
380f0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
38100 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
38110 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
38120 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54  ITE_OK;.  int nT
38130 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75  ries = 0;.  stru
38140 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63  ct timespec conc
38150 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d  hModTime;.  .  m
38160 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54  emset(&conchModT
38170 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  ime, 0, sizeof(c
38180 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20  onchModTime));. 
38190 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63   do {.    rc = c
381a0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
381b0 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
381c0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
381d0 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
381e0 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20    nTries ++;.   
381f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
38200 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a  BUSY ){.      /*
38210 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69   If the lock fai
38220 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20  led (busy):.    
38230 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65     * 1st try: ge
38240 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f  t the mod time o
38250 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69  f the conch, wai
38260 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61  t 0.5s and try a
38270 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20  gain. .       * 
38280 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66  2nd try: fail if
38290 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68   the mod time ch
382a0 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64  anged or host id
382b0 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77   is different, w
382c0 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20  ait .       *   
382d0 20 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61          10 sec a
382e0 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20  nd try again.   
382f0 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62      * 3rd try: b
38300 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e  reak the lock un
38310 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d  less the mod tim
38320 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20  e has changed.. 
38330 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
38340 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
38350 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
38360 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  t(conchFile->h, 
38370 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20  &buf) ){.       
38380 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
38390 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
383a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
383b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
383c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
383d0 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
383e0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
383f0 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75  onchModTime = bu
38400 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a  f.st_mtimespec;.
38410 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35          usleep(5
38420 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
38430 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20  0.5 sec and try 
38440 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f  the lock again*/
38450 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
38460 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e;  .      }..  
38470 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
38480 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66  es>1 );.      if
38490 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74  ( conchModTime.t
384a0 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  v_sec != buf.st_
384b0 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63  mtimespec.tv_sec
384c0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f   || .         co
384d0 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73  nchModTime.tv_ns
384e0 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
384f0 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29  mespec.tv_nsec )
38500 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
38510 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
38520 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
38530 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32     if( nTries==2
38540 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68   ){  .        ch
38550 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41  ar tBuf[PROXY_MA
38560 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
38570 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73      int len = os
38580 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d  Pread(conchFile-
38590 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f  >h, tBuf, PROXY_
385a0 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
385b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
385c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
385d0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastEr