/ Hex Artifact Content
Login

Artifact 7f9ed5f05e4a9eb7275d1216e46d245d0cebfebb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61  if../*.** standa
0c30: 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73  rd include files
0c40: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ..*/.#include <s
0c50: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
0c60: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
0c70: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
0c80: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  l.h>.#include <u
0c90: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0ca0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  e <time.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  .#include <errno
0cd0: 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .h>.#if !defined
0ce0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
0cf0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
0d00: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e  MMAP_SIZE>0.# in
0d10: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e  clude <sys/mman.
0d20: 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  h>.#endif..#if S
0d30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0d40: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 4f 53  KING_STYLE || OS
0d50: 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63 6c 75  _VXWORKS.# inclu
0d60: 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e  de <sys/ioctl.h>
0d70: 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  .# if OS_VXWORKS
0d80: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d  .#  include <sem
0d90: 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63  aphore.h>.#  inc
0da0: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0db0: 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64  # else.#  includ
0dc0: 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23  e <sys/file.h>.#
0dd0: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70    include <sys/p
0de0: 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a  aram.h>.# endif.
0df0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
0e00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0e10: 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65  STYLE */..#if de
0e20: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0e30: 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42   || (SQLITE_ENAB
0e40: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0e50: 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29   && !OS_VXWORKS)
0e60: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0e70: 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a  mount.h>.#endif.
0e80: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49  .#ifdef HAVE_UTI
0e90: 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74  ME.# include <ut
0ea0: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f  ime.h>.#endif../
0eb0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
0ec0: 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e  ues of unixFile.
0ed0: 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  fsFlags.*/.#defi
0ee0: 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  ne SQLITE_FSFLAG
0ef0: 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30  S_IS_MSDOS     0
0f00: 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  x1../*.** If we 
0f10: 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64  are to be thread
0f20: 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74  -safe, include t
0f30: 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64  he pthreads head
0f40: 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a  er and define.**
0f50: 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58   the SQLITE_UNIX
0f60: 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a  _THREADS macro..
0f70: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
0f80: 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75  READSAFE.# inclu
0f90: 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23  de <pthread.h>.#
0fa0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55   define SQLITE_U
0fb0: 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65  NIX_THREADS 1.#e
0fc0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  ndif../*.** Defa
0fd0: 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ult permissions 
0fe0: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
0ff0: 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e  new file.*/.#ifn
1000: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1010: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1020: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1030: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
1040: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34  _PERMISSIONS 064
1050: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  4.#endif../*.** 
1060: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1070: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1080: 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72  g auto proxy dir
1090: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
10a0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
10b0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
10c0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
10d0: 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
10e0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35  _PERMISSIONS 075
10f0: 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  5.#endif../*.** 
1100: 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  Maximum supporte
1110: 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a  d path-length..*
1120: 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  /.#define MAX_PA
1130: 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a  THNAME 512../*.*
1140: 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c  * Only set the l
1150: 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20  astErrno if the 
1160: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20  error code is a 
1170: 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e  real error and n
1180: 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20  ot .** a normal 
1190: 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20  expected return 
11a0: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42  code of SQLITE_B
11b0: 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  USY or SQLITE_OK
11c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c  .*/.#define IS_L
11d0: 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28  OCK_ERROR(x)  ((
11e0: 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20  x != SQLITE_OK) 
11f0: 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f  && (x != SQLITE_
1200: 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61  BUSY))../* Forwa
1210: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
1220: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1230: 75 6e 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b  unixShm unixShm;
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1250: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61  * Connection sha
1260: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red memory */.ty
1270: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1280: 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d  xShmNode unixShm
1290: 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  Node;       /* S
12a0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73  hared memory ins
12b0: 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66  tance */.typedef
12c0: 20 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64   struct unixInod
12d0: 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49  eInfo unixInodeI
12e0: 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e  nfo;   /* An i-n
12f0: 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ode */.typedef s
1300: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1310: 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b  Fd UnixUnusedFd;
1320: 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65       /* An unuse
1330: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1340: 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  r */../*.** Some
1350: 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66  times, after a f
1360: 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c  ile handle is cl
1370: 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20  osed by SQLite, 
1380: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1390: 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tor.** cannot be
13a0: 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74   closed immediat
13b0: 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61  ely. In these ca
13c0: 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f  ses, instances o
13d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
13e0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 72 65  ** structure are
13f0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
1400: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1410: 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67  or while waiting
1420: 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72   for an.** oppor
1430: 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72  tunity to either
1440: 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20   close or reuse 
1450: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e  it..*/.struct Un
1460: 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69  ixUnusedFd {.  i
1470: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
1480: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1490: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63   descriptor to c
14a0: 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  lose */.  int fl
14b0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
14c0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69      /* Flags thi
14d0: 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  s file descripto
14e0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74  r was opened wit
14f0: 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  h */.  UnixUnuse
1500: 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  dFd *pNext;     
1510: 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20   /* Next unused 
1520: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1530: 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a  on same file */.
1540: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e  };../*.** The un
1550: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
1560: 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20   is subclass of 
1570: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65  sqlite3_file spe
1580: 63 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69  cific to the uni
1590: 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65  x.** VFS impleme
15a0: 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70  ntations..*/.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
15c0: 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73  File unixFile;.s
15d0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b  truct unixFile {
15e0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
15f0: 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65  thods const *pMe
1600: 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73  thod;  /* Always
1610: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1620: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
1630: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
1640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1650: 20 56 46 53 20 74 68 61 74 20 63 72 65 61 74 65   VFS that create
1660: 64 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20  d this unixFile 
1670: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
1680: 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
1690: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
16a0: 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20   about locks on 
16b0: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
16c0: 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
16f0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
1700: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
1710: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
1720: 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20      /* The type 
1730: 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  of lock held on 
1740: 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73  this fd */.  uns
1750: 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20  igned short int 
1760: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
1770: 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62   /* Behavioral b
1780: 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a  its.  UNIXFILE_*
1790: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
17a0: 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e  /* The unix errn
17d0: 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20  o from last I/O 
17e0: 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20  error */.  void 
17f0: 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  *lockingContext;
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1810: 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  * Locking style 
1820: 73 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a  specific state *
1830: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
1840: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
1850: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61          /* Pre-a
1860: 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75  llocated UnixUnu
1870: 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  sedFd */.  const
1880: 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20   char *zPath;   
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
18b0: 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
18c0: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18e0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
18f0: 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ment information
1900: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e   */.  int szChun
1910: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1930: 66 69 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c  figured by FCNTL
1940: 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23  _CHUNK_SIZE */.#
1950: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1960: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20  AP_SIZE>0.  int 
1970: 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20  nFetchOut;      
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
19a0: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
19b0: 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  refs */.  sqlite
19c0: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
19d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19e0: 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
19f0: 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52  mapping at pMapR
1a00: 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  egion */.  sqlit
1a10: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a  e3_int64 mmapSiz
1a20: 65 41 63 74 75 61 6c 3b 20 20 20 20 20 20 20 2f  eActual;       /
1a30: 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  * Actual size of
1a40: 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70   mapping at pMap
1a50: 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  Region */.  sqli
1a60: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
1a70: 7a 65 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20  zeMax;          
1a80: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43  /* Configured FC
1a90: 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61  NTL_MMAP_SIZE va
1aa0: 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  lue */.  void *p
1ab0: 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  MapRegion;      
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65  Memory mapped re
1ae0: 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  gion */.#endif.#
1af0: 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1b00: 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a  .  int sectorSiz
1b10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b20: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
1b30: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   sector size */.
1b40: 20 20 69 6e 74 20 64 65 76 69 63 65 43 68 61 72    int deviceChar
1b50: 61 63 74 65 72 69 73 74 69 63 73 3b 20 20 20 20  acteristics;    
1b60: 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70        /* Precomp
1b70: 75 74 65 64 20 64 65 76 69 63 65 20 63 68 61 72  uted device char
1b80: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23  acteristics */.#
1b90: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1ba0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1bb0: 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e  STYLE.  int open
1bc0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1be0: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1bf0: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1c00: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1c10: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c20: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1c30: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1c40: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74     /* cached det
1c70: 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73  ails from statfs
1c80: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  () */.#endif.#if
1c90: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
1ca0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
1cb0: 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20  Id *pId;        
1cc0: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
1cd0: 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69   ID */.#endif.#i
1ce0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cf0: 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  G.  /* The next 
1d00: 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c  group of variabl
1d10: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  es are used to t
1d20: 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20  rack whether or 
1d30: 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  not the.  ** tra
1d40: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1d50: 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20   in bytes 24-27 
1d60: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
1d70: 73 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20  s are updated.  
1d80: 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20  ** whenever any 
1d90: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
1da0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
1db0: 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c  n assertion faul
1dc0: 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75  t will.  ** occu
1dd0: 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75  r if a file is u
1de0: 70 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  pdated without a
1df0: 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65  lso updating the
1e00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
1e10: 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  * counter.  This
1e20: 20 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f   test is made to
1e30: 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c   avoid new probl
1e40: 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  ems similar to t
1e50: 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63  he.  ** one desc
1e60: 72 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20  ribed by ticket 
1e70: 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75  #3584. .  */.  u
1e80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61  nsigned char tra
1e90: 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a  nsCntrChng;   /*
1ea0: 20 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61   True if the tra
1eb0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1ec0: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
1ed0: 73 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70  signed char dbUp
1ee0: 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  date;        /* 
1ef0: 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74  True if any part
1f00: 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
1f10: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
1f20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e  nsigned char inN
1f30: 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a  ormalWrite;   /*
1f40: 20 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f   True if in a no
1f50: 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61  rmal write opera
1f60: 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a  tion */..#endif.
1f70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1f80: 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74  EST.  /* In test
1f90: 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20   mode, increase 
1fa0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73  the size of this
1fb0: 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74   structure a bit
1fc0: 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69   so that .  ** i
1fd0: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
1fe0: 20 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73   the struct Cras
1ff0: 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e  hFile defined in
2000: 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20   test6.c..  */. 
2010: 20 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33   char aPadding[3
2020: 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f  2];.#endif.};../
2030: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
2040: 68 6f 6c 64 73 20 74 68 65 20 70 72 6f 63 65 73  holds the proces
2050: 73 20 69 64 20 28 70 69 64 29 20 66 72 6f 6d 20  s id (pid) from 
2060: 77 68 65 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d  when the xRandom
2070: 6e 65 73 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ness().** method
2080: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 20 49 66   was called.  If
2090: 20 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c   xOpen() is call
20a0: 65 64 20 66 72 6f 6d 20 61 20 64 69 66 66 65 72  ed from a differ
20b0: 65 6e 74 20 70 72 6f 63 65 73 73 20 69 64 2c 0a  ent process id,.
20c0: 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ** indicating th
20d0: 61 74 20 61 20 66 6f 72 6b 28 29 20 68 61 73 20  at a fork() has 
20e0: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 20 50 52  occurred, the PR
20f0: 4e 47 20 77 69 6c 6c 20 62 65 20 72 65 73 65 74  NG will be reset
2100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2110: 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
2120: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  0;../*.** Allowe
2130: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  d values for the
2140: 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c   unixFile.ctrlFl
2150: 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a  ags bitmask:.*/.
2160: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2170: 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30  _EXCL        0x0
2180: 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  1     /* Connect
2190: 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72  ions from one pr
21a0: 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64  ocess only */.#d
21b0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52  efine UNIXFILE_R
21c0: 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20  DONLY      0x02 
21d0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
21e0: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
21f0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2200: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30  LE_PERSIST_WAL 0
2210: 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69  x04     /* Persi
2220: 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a  stent WAL mode *
2230: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2240: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
2250: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
2260: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
2270: 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74  08     /* Direct
2280: 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20  ory sync needed 
2290: 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  */.#else.# defin
22a0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
22b0: 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69  NC    0x00.#endi
22c0: 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  f.#define UNIXFI
22d0: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30  LE_PSOW        0
22e0: 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  x10     /* SQLIT
22f0: 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
2300: 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23  E_OVERWRITE */.#
2310: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2320: 44 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30  DELETE      0x20
2330: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f       /* Delete o
2340: 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69  n close */.#defi
2350: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20  ne UNIXFILE_URI 
2360: 20 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20          0x40    
2370: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67   /* Filename mig
2380: 68 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61  ht have query pa
2390: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66  rameters */.#def
23a0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  ine UNIXFILE_NOL
23b0: 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20  OCK      0x80   
23c0: 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20    /* Do no file 
23d0: 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 23 64 65 66 69  locking */.#defi
23e0: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  ne UNIXFILE_WARN
23f0: 45 44 20 20 20 20 30 78 30 31 30 30 20 20 20 20  ED    0x0100    
2400: 20 2f 2a 20 76 65 72 69 66 79 44 62 46 69 6c 65   /* verifyDbFile
2410: 28 29 20 77 61 72 6e 69 6e 67 73 20 68 61 76 65  () warnings have
2420: 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
2430: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
2440: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
2450: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
2460: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
2470: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2480: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
2490: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
24a0: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
24b0: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
24c0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
24d0: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
24e0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
24f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2500: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
2510: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
2520: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
2530: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2540: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
2550: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
2560: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
2570: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2580: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
2590: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
25a0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
25b0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
25c0: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
25d0: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
25e0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
25f0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2600: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2610: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2620: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2630: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2640: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2650: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
2660: 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50  *.** HAVE_MREMAP
2670: 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75   defaults to tru
2680: 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66  e on Linux and f
2690: 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65 20  alse everywhere 
26a0: 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  else..*/.#if !de
26b0: 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41  fined(HAVE_MREMA
26c0: 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28  P).# if defined(
26d0: 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
26e0: 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43  fined(_GNU_SOURC
26f0: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  E).#  define HAV
2700: 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73  E_MREMAP 1.# els
2710: 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45  e.#  define HAVE
2720: 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69  _MREMAP 0.# endi
2730: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
2740: 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 20  Explicitly call 
2750: 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73 69  the 64-bit versi
2760: 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f 6e  on of lseek() on
2770: 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72 77   Android. Otherw
2780: 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a 20  ise, lseek().** 
2790: 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76 65  is the 32-bit ve
27a0: 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20 5f  rsion, even if _
27b0: 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53  FILE_OFFSET_BITS
27c0: 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  =64 is defined..
27d0: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52  */.#ifdef __ANDR
27e0: 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20 6c  OID__.# define l
27f0: 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65 6e  seek lseek64.#en
2800: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65  dif../*.** Diffe
2810: 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d  rent Unix system
2820: 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29  s declare open()
2830: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61   in different wa
2840: 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a  ys.  Same use.**
2850: 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72   open(const char
2860: 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20  *,int,mode_t).  
2870: 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28  Others use open(
2880: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2890: 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66  ...)..** The dif
28a0: 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72  ference is impor
28b0: 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20  tant when using 
28c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
28d0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
28e0: 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20   The safest way 
28f0: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  to deal with the
2900: 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61   problem is to a
2910: 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77  lways use this w
2920: 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20  rapper.** which 
2930: 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73  always has the s
2940: 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64  ame well-defined
2950: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
2960: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f  tatic int posixO
2970: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
2980: 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  zFile, int flags
2990: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72  , int mode){.  r
29a0: 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65  eturn open(zFile
29b0: 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a  , flags, mode);.
29c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65  }../*.** On some
29d0: 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20   systems, calls 
29e0: 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c  to fchown() will
29f0: 20 74 72 69 67 67 65 72 20 61 20 6d 65 73 73 61   trigger a messa
2a00: 67 65 20 69 6e 20 61 20 73 65 63 75 72 69 74 79  ge in a security
2a10: 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20  .** log if they 
2a20: 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f  come from non-ro
2a30: 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53  ot processes.  S
2a40: 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20  o avoid calling 
2a50: 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77  fchown() if.** w
2a60: 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e  e are not runnin
2a70: 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74  g as root..*/.st
2a80: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 46 63  atic int posixFc
2a90: 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64  hown(int fd, uid
2aa0: 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69  _t uid, gid_t gi
2ab0: 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d){.#if OS_VXWOR
2ac0: 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  KS.  return 0;.#
2ad0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 67 65  else.  return ge
2ae0: 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20 66 63  teuid() ? 0 : fc
2af0: 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29  hown(fd,uid,gid)
2b00: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 46  ;.#endif.}../* F
2b10: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
2b20: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2b30: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
2b40: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b  st char*, int*);
2b50: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2b60: 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64  Getpagesize(void
2b70: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  );../*.** Many s
2b80: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
2b90: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
2ba0: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
2bb0: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
2bc0: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
2bd0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
2be0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
2bf0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
2c00: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
2c10: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
2c20: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
2c30: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
2c40: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
2c50: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
2c60: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
2c70: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
2c80: 74 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f  tic struct unix_
2c90: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
2ca0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
2cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2cc0: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
2cd0: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
2ce0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43  3_syscall_ptr pC
2cf0: 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65  urrent; /* Curre
2d00: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
2d10: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
2d20: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2d30: 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f  _ptr pDefault; /
2d40: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
2d50: 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20  */.} aSyscall[] 
2d60: 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20  = {.  { "open", 
2d70: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2d80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
2d90: 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23  ixOpen,  0  },.#
2da0: 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20  define osOpen   
2db0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2dc0: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29  t char*,int,int)
2dd0: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
2de0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f  rrent)..  { "clo
2df0: 73 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  se",        (sql
2e00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2e10: 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20  )close,      0  
2e20: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f  },.#define osClo
2e30: 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  se     ((int(*)(
2e40: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d  int))aSyscall[1]
2e50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2e60: 22 61 63 63 65 73 73 22 2c 20 20 20 20 20 20 20  "access",       
2e70: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2e80: 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20 20 20  _ptr)access,    
2e90: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2ea0: 73 41 63 63 65 73 73 20 20 20 20 28 28 69 6e 74  sAccess    ((int
2eb0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
2ec0: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d  int))aSyscall[2]
2ed0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2ee0: 22 67 65 74 63 77 64 22 2c 20 20 20 20 20 20 20  "getcwd",       
2ef0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2f00: 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20 20 20  _ptr)getcwd,    
2f10: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2f20: 73 47 65 74 63 77 64 20 20 20 20 28 28 63 68 61  sGetcwd    ((cha
2f30: 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65  r*(*)(char*,size
2f40: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e  _t))aSyscall[3].
2f50: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2f60: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 28  stat",         (
2f70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2f80: 70 74 72 29 73 74 61 74 2c 20 20 20 20 20 20 20  ptr)stat,       
2f90: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2fa0: 53 74 61 74 20 20 20 20 20 20 28 28 69 6e 74 28  Stat      ((int(
2fb0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  *)(const char*,s
2fc0: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
2fd0: 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e  scall[4].pCurren
2fe0: 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a  t)../*.** The DJ
2ff0: 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76  GPP compiler env
3000: 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d  ironment looks m
3010: 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c  ostly like Unix,
3020: 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73   but it.** lacks
3030: 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   the fcntl() sys
3040: 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65  tem call.  So re
3050: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74  define fcntl() t
3060: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  o be something.*
3070: 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75  * that always su
3080: 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65  cceeds.  This me
3090: 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67  ans that locking
30a0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
30b0: 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20  under.** DJGPP. 
30c0: 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d   But it is DOS -
30d0: 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78   what did you ex
30e0: 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20  pect?.*/.#ifdef 
30f0: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66  __DJGPP__.  { "f
3100: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c  stat",        0,
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3130: 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20  sFstat(a,b,c)   
3140: 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20   0.#else     .  
3150: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
3160: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3170: 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20  ll_ptr)fstat,   
3180: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3190: 20 6f 73 46 73 74 61 74 20 20 20 20 20 28 28 69   osFstat     ((i
31a0: 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74  nt(*)(int,struct
31b0: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
31c0: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  [5].pCurrent).#e
31d0: 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e  ndif..  { "ftrun
31e0: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
31f0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3200: 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c  truncate,  0  },
3210: 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e  .#define osFtrun
3220: 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e  cate ((int(*)(in
3230: 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c  t,off_t))aSyscal
3240: 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[6].pCurrent)..
3250: 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20    { "fcntl",    
3260: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3270: 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20  call_ptr)fcntl, 
3280: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3290: 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28  ne osFcntl     (
32a0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c  (int(*)(int,int,
32b0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  ...))aSyscall[7]
32c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
32d0: 22 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 20  "read",         
32e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
32f0: 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20 20 20  _ptr)read,      
3300: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3310: 73 52 65 61 64 20 20 20 20 20 20 28 28 73 73 69  sRead      ((ssi
3320: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
3330: 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61  *,size_t))aSysca
3340: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
3350: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
3360: 5f 50 52 45 41 44 29 20 7c 7c 20 28 53 51 4c 49  _PREAD) || (SQLI
3370: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
3380: 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
3390: 58 57 4f 52 4b 53 29 0a 20 20 7b 20 22 70 72 65  XWORKS).  { "pre
33a0: 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ad",        (sql
33b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
33c0: 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20 20  )pread,      0  
33d0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
33e0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
33f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3400: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
3410: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
3420: 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20 28  ne osPread     (
3430: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3440: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
3450: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  _t))aSyscall[9].
3460: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3470: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3480: 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34  64).  { "pread64
3490: 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ",      (sqlite3
34a0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
34b0: 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23  ad64,    0  },.#
34c0: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36  else.  { "pread6
34d0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
34e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
34f0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3500: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3510: 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73 69  sPread64   ((ssi
3520: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
3530: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
3540: 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75  aSyscall[10].pCu
3550: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69  rrent)..  { "wri
3560: 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  te",        (sql
3570: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3580: 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20 20  )write,      0  
3590: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  },.#define osWri
35a0: 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  te     ((ssize_t
35b0: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
35c0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
35d0: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
35e0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
35f0: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 28 53  USE_PREAD) || (S
3600: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3610: 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
3620: 53 5f 56 58 57 4f 52 4b 53 29 0a 20 20 7b 20 22  S_VXWORKS).  { "
3630: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
3640: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3650: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
3660: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3670: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
3680: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3690: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
36a0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
36b0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
36c0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
36d0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
36e0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3710: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3720: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3730: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3740: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3750: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3760: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
3770: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3780: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3790: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
37a0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
37b0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
37c0: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
37d0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
37e0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
37f0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3800: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3810: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3820: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3830: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3840: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3850: 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  mod,     0  },.#
3860: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3870: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3880: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3890: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
38a0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
38b0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
38c0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
38d0: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
38e0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
38f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3900: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3910: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3920: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3930: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3940: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3950: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3960: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3970: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3980: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3990: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
39a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
39b0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
39c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
39d0: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
39e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
39f0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3a00: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3a10: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3a20: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3a30: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3a40: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3a50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3a60: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3a70: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3a80: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3a90: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3aa0: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3ab0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3ac0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3ad0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3ae0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3af0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3b00: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3b10: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3b20: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3b30: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3b40: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3b50: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3b60: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3b70: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3b80: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3b90: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3ba0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3bb0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3bc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3bd0: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3be0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3bf0: 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20  r)posixFchown,  
3c00: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3c10: 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e  osFchown    ((in
3c20: 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67  t(*)(int,uid_t,g
3c30: 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  id_t))aSyscall[2
3c40: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3c50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3c60: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
3c70: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
3c80: 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22  IZE>0.  { "mmap"
3c90: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3ca0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61  _syscall_ptr)mma
3cb0: 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  p,     0 },.#def
3cc0: 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69  ine osMmap ((voi
3cd0: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3ce0: 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f  _t,int,int,int,o
3cf0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ff_t))aSyscall[2
3d00: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
3d10: 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20  { "munmap",     
3d20: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3d30: 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20  ll_ptr)munmap,  
3d40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3d50: 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28  fine osMunmap ((
3d60: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
3d70: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3d80: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
3d90: 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
3da0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
3db0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3dc0: 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20  all_ptr)mremap, 
3dd0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3de0: 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22  lse.  { "mremap"
3df0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3e00: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3e20: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3e30: 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f 69  e osMremap ((voi
3e40: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3e50: 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e  _t,size_t,int,..
3e60: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  .))aSyscall[23].
3e70: 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20 22 67  pCurrent).  { "g
3e80: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
3e90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3ea0: 74 72 29 75 6e 69 78 47 65 74 70 61 67 65 73 69  tr)unixGetpagesi
3eb0: 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65  ze, 0 },.#define
3ec0: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
3ed0: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
3ee0: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
3ef0: 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b  ent)..#endif..};
3f00: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
3f10: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
3f20: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
3f30: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
3f40: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
3f50: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
3f60: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
3f70: 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56   the.** "unix" V
3f80: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
3f90: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
3fa0: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
3fb0: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
3fc0: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
3fd0: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
3fe0: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
3ff0: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
4000: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
4010: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
4020: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53  tic int unixSetS
4030: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4040: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4050: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
4060: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
4070: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
4080: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
4090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
40a0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
40b0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
40c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
40d0: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
40e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
40f0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
4100: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
4110: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
4120: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4130: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
4140: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4150: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
4160: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
4170: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
4180: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
4190: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
41a0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
41b0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
41c0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
41d0: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
41e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
41f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
4200: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
4210: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
4220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4230: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
4240: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
4250: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
4260: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
4270: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
4280: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4290: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
42a0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
42b0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
42c0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
42d0: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
42e0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
42f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4300: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
4310: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
4320: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4330: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
4340: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4350: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
4360: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
4370: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
4380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
4390: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
43a0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
43b0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
43c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
43d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
43e0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
43f0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
4400: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
4410: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
4420: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4430: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
4440: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4460: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4480: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
4490: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
44a0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
44b0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
44c0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
44d0: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
44e0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
44f0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
4500: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
4510: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
4520: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
4530: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69  _syscall_ptr uni
4540: 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xGetSystemCall(.
4550: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
4560: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
4570: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
4580: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
4590: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
45a0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
45b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
45c0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
45d0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
45e0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
45f0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4600: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4610: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
4620: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4630: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
4640: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
4650: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
4660: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
4670: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
4680: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
4690: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
46a0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
46b0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
46c0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
46d0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
46e0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
46f0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
4700: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
4710: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
4720: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
4730: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
4740: 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74  ar *unixNextSyst
4750: 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76  emCall(sqlite3_v
4760: 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  fs *p, const cha
4770: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4780: 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53   i = -1;..  UNUS
4790: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
47a0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
47b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
47c0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
47d0: 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l)-1; i++){.    
47e0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
47f0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4800: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
4810: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
4820: 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53  or(i++; i<ArrayS
4830: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69  ize(aSyscall); i
4840: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79  ++){.    if( aSy
4850: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4860: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  t!=0 ) return aS
4870: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b  yscall[i].zName;
4880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  .}../*.** Do not
48a0: 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65   accept any file
48b0: 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73   descriptor less
48c0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
48d0: 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  , in order to av
48e0: 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64  oid.** opening d
48f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69  atabase file usi
4900: 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ng file descript
4910: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ors that are com
4920: 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a  monly used for .
4930: 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  ** standard inpu
4940: 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65  t, output, and e
4950: 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rror..*/.#ifndef
4960: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
4970: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a  FILE_DESCRIPTOR.
4980: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
4990: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
49a0: 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66  CRIPTOR 3.#endif
49b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f  ../*.** Invoke o
49c0: 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75  pen().  Do so mu
49d0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e  ltiple times, un
49e0: 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75  til it either su
49f0: 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69  cceeds or.** fai
4a00: 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73  ls for some reas
4a10: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49  on other than EI
4a20: 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  NTR..**.** If th
4a30: 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
4a40: 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68  mode "m" is 0 th
4a50: 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65  en set it to the
4a60: 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20   default for.** 
4a70: 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66  SQLite.  The def
4a80: 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44  ault is SQLITE_D
4a90: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
4aa0: 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c  ISSIONS (normall
4ab0: 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f  y.** 0644) as mo
4ac0: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79  dified by the sy
4ad0: 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20  stem umask.  If 
4ae0: 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  m is not 0, then
4af0: 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c  .** make the fil
4b00: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
4b10: 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e  be exactly m ign
4b20: 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e  oring the umask.
4b30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72  .**.** The m par
4b40: 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e  ameter will be n
4b50: 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65  on-zero only whe
4b60: 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c  n creating -wal,
4b70: 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e   -journal,.** an
4b80: 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57  d -shm files.  W
4b90: 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c  e want those fil
4ba0: 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63  es to have *exac
4bb0: 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a  tly* the same.**
4bc0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20   permissions as 
4bd0: 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
4be0: 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74  atabase, unadult
4bf0: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d  erated by the um
4c00: 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  ask..** In that 
4c10: 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61  way, if a databa
4c20: 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72  se file is -rw-r
4c30: 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72  w-rw or -rw-rw-r
4c40: 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e  -, and a.** tran
4c50: 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20  saction crashes 
4c60: 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e  and leaves behin
4c70: 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20  d hot journals, 
4c80: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63  then any.** proc
4c90: 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65  ess that is able
4ca0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
4cb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61   database will a
4cc0: 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a  lso be able to.*
4cd0: 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f  * recover the ho
4ce0: 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73  t journals..*/.s
4cf0: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4d00: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
4d10: 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65   *z, int f, mode
4d20: 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b  _t m){.  int fd;
4d30: 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d  .  mode_t m2 = m
4d40: 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45   ? m : SQLITE_DE
4d50: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
4d60: 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28  SSIONS;.  while(
4d70: 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  1){.#if defined(
4d80: 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66  O_CLOEXEC).    f
4d90: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f  d = osOpen(z,f|O
4da0: 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65  _CLOEXEC,m2);.#e
4db0: 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f  lse.    fd = osO
4dc0: 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e  pen(z,f,m2);.#en
4dd0: 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30  dif.    if( fd<0
4de0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
4df0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e  rno==EINTR ) con
4e00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65  tinue;.      bre
4e10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
4e20: 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e  ( fd>=SQLITE_MIN
4e30: 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49  IMUM_FILE_DESCRI
4e40: 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20  PTOR ) break;.  
4e50: 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20    osClose(fd);. 
4e60: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
4e70: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a  QLITE_WARNING, .
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e  "attempt to open
4ea0: 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20   \"%s\" as file 
4eb0: 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20  descriptor %d", 
4ec0: 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d  z, fd);.    fd =
4ed0: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f   -1;.    if( osO
4ee0: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
4ef0: 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b   f, m)<0 ) break
4f00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d  ;.  }.  if( fd>=
4f10: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d  0 ){.    if( m!=
4f20: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
4f30: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a  t stat statbuf;.
4f40: 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
4f50: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d  t(fd, &statbuf)=
4f60: 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74  =0 .       && st
4f70: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
4f80: 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74  .       && (stat
4f90: 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  buf.st_mode&0777
4fa0: 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20  )!=m .      ){. 
4fb0: 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
4fc0: 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, m);.      }.
4fd0: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
4fe0: 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26  d(FD_CLOEXEC) &&
4ff0: 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f   (!defined(O_CLO
5000: 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58  EXEC) || O_CLOEX
5010: 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e  EC==0).    osFcn
5020: 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
5030: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
5040: 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
5050: 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
5060: 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d  }.  return fd;.}
5070: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
5080: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
5090: 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
50a0: 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
50b0: 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
50c0: 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
50d0: 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75  to protect the u
50e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64  nixInodeInfo and
50f0: 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  .** vxworksFileI
5100: 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  d objects used b
5110: 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  y this file, all
5120: 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
5130: 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d   .** shared by m
5140: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
5150: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
5160: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
5170: 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
5180: 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
5190: 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
51a0: 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
51b0: 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
51c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
51d0: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
51e0: 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
51f0: 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
5200: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
5210: 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
5220: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5230: 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74   );.**   unixEnt
5240: 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61  erLeave().*/.sta
5250: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74  tic void unixEnt
5260: 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
5270: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5280: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
5290: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
52a0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
52b0: 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
52c0: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
52d0: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
52e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
52f0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5300: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5310: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
5320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5330: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
5340: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f  unixMutexHeld(vo
5350: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
5360: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5370: 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
5380: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5390: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
53a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
53b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
53c0: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
53d0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
53e0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
53f0: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
5400: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
5410: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
5420: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
5430: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
5440: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
5450: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
5460: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
5470: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
5480: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5490: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
54a0: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
54b0: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
54c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
54d0: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
54e0: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
54f0: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
5500: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
5510: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
5520: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
5530: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
5540: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
5550: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
5560: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
5570: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
5580: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
5590: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
55a0: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
55b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
55c0: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
55d0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
55e0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
55f0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
5600: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
5610: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5620: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
5630: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
5640: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
5650: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
5660: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
5670: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
5680: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
5690: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
56a0: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
56b0: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
56c0: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
56d0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
56e0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
56f0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
5700: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
5710: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
5720: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
5730: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
5740: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
5750: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
5760: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
5770: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
5780: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
5790: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
57a0: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
57b0: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
57c0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
57d0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
57e0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
57f0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
5800: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
5810: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
5820: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
5830: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5840: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
5850: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
5860: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
5870: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5880: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5890: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
58a0: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
58b0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
58c0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
58d0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
58e0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
58f0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
5900: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
5910: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
5920: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
5930: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
5940: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
5950: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
5960: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
5970: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
5980: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
5990: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
59a0: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
59b0: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
59c0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
59d0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
59e0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
59f0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
5a00: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
5a10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
5a20: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
5a30: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
5a40: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
5a50: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5a60: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
5a70: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
5a80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5a90: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
5aa0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5ab0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
5ac0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
5ad0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5ae0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5af0: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
5b00: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5b10: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
5b20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5b30: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
5b40: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
5b50: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
5b60: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
5b70: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
5b80: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
5b90: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
5ba0: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
5bb0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
5bc0: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
5bd0: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
5be0: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
5bf0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
5c00: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
5c10: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
5c20: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
5c30: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a   due to EINTR.**
5c40: 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f  .** All calls to
5c50: 20 66 74 72 75 6e 63 61 74 65 28 29 20 77 69 74   ftruncate() wit
5c60: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68  hin this file sh
5c70: 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74 68 72  ould be made thr
5c80: 6f 75 67 68 20 74 68 69 73 20 77 72 61 70 70 65  ough this wrappe
5c90: 72 2e 0a 2a 2a 20 4f 6e 20 74 68 65 20 41 6e 64  r..** On the And
5ca0: 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62  roid platform, b
5cb0: 79 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f 67  ypassing the log
5cc0: 69 63 20 62 65 6c 6f 77 20 63 6f 75 6c 64 20 6c  ic below could l
5cd0: 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74  ead to a corrupt
5ce0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  .** database..*/
5cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
5d00: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
5d10: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
5d20: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
5d30: 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49  .#ifdef __ANDROI
5d40: 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72  D__.  /* On Andr
5d50: 6f 69 64 2c 20 66 74 72 75 6e 63 61 74 65 28 29  oid, ftruncate()
5d60: 20 61 6c 77 61 79 73 20 75 73 65 73 20 33 32 2d   always uses 32-
5d70: 62 69 74 20 6f 66 66 73 65 74 73 2c 20 65 76 65  bit offsets, eve
5d80: 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45  n if .  ** _FILE
5d90: 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20  _OFFSET_BITS=64 
5da0: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
5db0: 20 6d 65 61 6e 73 20 69 74 20 69 73 20 75 6e 73   means it is uns
5dc0: 61 66 65 20 74 6f 20 61 74 74 65 6d 70 74 20 74  afe to attempt t
5dd0: 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 20  o.  ** truncate 
5de0: 61 20 66 69 6c 65 20 74 6f 20 61 6e 79 20 73 69  a file to any si
5df0: 7a 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 32  ze larger than 2
5e00: 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67  GiB. Silently ig
5e10: 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75  nore any.  ** su
5e20: 63 68 20 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f  ch attempts.  */
5e30: 0a 20 20 69 66 28 20 73 7a 3e 28 73 71 6c 69 74  .  if( sz>(sqlit
5e40: 65 33 5f 69 6e 74 36 34 29 30 78 37 46 46 46 46  e3_int64)0x7FFFF
5e50: 46 46 46 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  FFF ){.    rc = 
5e60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
5e70: 73 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20  se.#endif.  do{ 
5e80: 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65  rc = osFtruncate
5e90: 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20  (h,sz); }while( 
5ea0: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
5eb0: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
5ec0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
5ed0: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
5ee0: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
5ef0: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
5f00: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
5f10: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
5f20: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
5f30: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
5f40: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
5f50: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
5f60: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
5f70: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
5f80: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
5f90: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
5fa0: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
5fb0: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
5fc0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
5fd0: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
5fe0: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
5ff0: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
6000: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
6010: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
6020: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
6030: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6040: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
6050: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
6060: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
6070: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
6080: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
6090: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
60a0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
60b0: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
60c0: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
60d0: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
60e0: 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f  ror) {.#if 0.  /
60f0: 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
6100: 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f 74  his code was not
6110: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
6120: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73 20  In theory, this 
6130: 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75  branch.  ** shou
6140: 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74 2c  ld never be hit,
6150: 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
6160: 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  n should only be
6170: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20 20   called after.  
6180: 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c  ** a locking-rel
6190: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28 69  ated function (i
61a0: 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61 73  .e. fcntl()) has
61b0: 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65   returned non-ze
61c0: 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ro with.  ** the
61d0: 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20   value of errno 
61e0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
61f0: 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20 73  ument. Since a s
6200: 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20 66  ystem call has f
6210: 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e  ailed,.  ** errn
6220: 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d  o should be non-
6230: 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
6240: 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69 66  Despite this, if
6250: 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73   errno really is
6260: 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20   zero, we still 
6270: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
6280: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
6290: 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d 20  _OK. The system 
62a0: 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64  call failed, and
62b0: 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65   *some* SQLite e
62c0: 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a 20  rror should be. 
62d0: 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20 62   ** propagated b
62e0: 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ack to the calle
62f0: 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68  r. Commenting th
6300: 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d 65  is branch out me
6310: 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a  ans errno==0.  *
6320: 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65  * will be handle
6330: 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75 6c  d by the "defaul
6340: 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a  t:" case below..
6350: 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a    */.  case 0: .
6360: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6370: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  E_OK;.#endif..  
6380: 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63  case EAGAIN:.  c
6390: 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20  ase ETIMEDOUT:. 
63a0: 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63   case EBUSY:.  c
63b0: 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73  ase EINTR:.  cas
63c0: 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20  e ENOLCK:  .    
63d0: 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65  /* random NFS re
63e0: 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73  try error, unles
63f0: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
6400: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
6410: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
6420: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
6430: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
6440: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20  hat it says */. 
6450: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6460: 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61  _BUSY;.    .  ca
6470: 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20  se EACCES: .    
6480: 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b  /* EACCES is lik
6490: 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20  e EAGAIN during 
64a0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
64b0: 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ns, but not any 
64c0: 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20  other time*/.   
64d0: 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72   if( (sqliteIOEr
64e0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
64f0: 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20  R_LOCK) || .    
6500: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
6510: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6520: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  _UNLOCK) || .   
6530: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6540: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6550: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20  R_RDLOCK) ||.   
6560: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6570: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6580: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
6590: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  OCK) ){.      re
65a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
65b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65  ;.    }.    /* e
65c0: 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  lse fall through
65d0: 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d   */.  case EPERM
65e0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
65f0: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a  LITE_PERM;.    .
6600: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
6610: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
6620: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
6630: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
6640: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
6650: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
6660: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6670: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
6680: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
6690: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
66a0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
66b0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
66c0: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
66d0: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
66e0: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
66f0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
6700: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
6710: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
6720: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
6730: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
6740: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
6750: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
6760: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
6770: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
6780: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
6790: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
67a0: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
67b0: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
67c0: 23 69 66 64 65 66 20 45 53 54 41 4c 45 20 20 20  #ifdef ESTALE   
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e    /* ESTALE is n
67f0: 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e  ot defined on In
6800: 74 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f  terix systems */
6810: 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a  .  case ESTALE:.
6820: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e  #endif.  case EN
6830: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
6840: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
6850: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
6860: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
6870: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
6880: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
6890: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
68a0: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  IOErr;.  }.}.../
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6910: 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46  * Begin Unique F
6920: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
6930: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
6940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6950: 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72  *.** On most ver
6960: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77  sions of unix, w
6970: 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71  e can get a uniq
6980: 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65  ue ID for a file
6990: 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e   by concatenatin
69a0: 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20  g.** the device 
69b0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
69c0: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75  node number.  Bu
69d0: 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  t this does not 
69e0: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
69f0: 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20  .** On VxWorks, 
6a00: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64  a unique file id
6a10: 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f   must be based o
6a20: 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  n the canonical 
6a30: 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  filename..**.** 
6a40: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  A pointer to an 
6a50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
6a60: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
6a70: 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ure can be used 
6a80: 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66  as a.** unique f
6a90: 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b  ile ID in VxWork
6aa0: 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63  s.  Each instanc
6ab0: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
6ac0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ure contains.** 
6ad0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
6ae0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6af0: 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f  .  There is also
6b00: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
6b10: 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72  nt.  .** The str
6b20: 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69  ucture is reclai
6b30: 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  med when the num
6b40: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6b50: 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a  to it drops to.*
6b60: 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  * zero..**.** Th
6b70: 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65  ere are never ve
6b80: 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70  ry many files op
6b90: 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61  en at one time a
6ba0: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e  nd lookups are n
6bb0: 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61  ot.** a performa
6bc0: 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74  nce-critical pat
6bd0: 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66  h, so it is suff
6be0: 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68  icient to put th
6bf0: 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ese.** structure
6c00: 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s on a linked li
6c10: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78  st..*/.struct vx
6c20: 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20  worksFileId {.  
6c30: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6c40: 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  leId *pNext;  /*
6c50: 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20   Next in a list 
6c60: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
6c70: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6c90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
6ca0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f  rences to this o
6cb0: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ne */.  int nNam
6cc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6cd0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6ce0: 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61  of the zCanonica
6cf0: 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a  lName[] string *
6d00: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e  /.  char *zCanon
6d10: 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  icalName;       
6d20: 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66    /* Canonical f
6d30: 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23  ilename */.};..#
6d40: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
6d50: 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20   .** All unique 
6d60: 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65  filenames are he
6d70: 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  ld on a linked l
6d80: 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68  ist headed by th
6d90: 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a  is.** variable:.
6da0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
6db0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
6dc0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
6dd0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70  = 0;../*.** Simp
6de0: 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20  lify a filename 
6df0: 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63  into its canonic
6e00: 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61  al form.** by ma
6e10: 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  king the followi
6e20: 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a  ng changes:.**.*
6e30: 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e  *  * removing an
6e40: 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64  y trailing and d
6e50: 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a  uplicate /.**  *
6e60: 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74   convert /./ int
6e70: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63  o just /.**  * c
6e80: 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68  onvert /A/../ wh
6e90: 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d  ere A is any sim
6ea0: 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75  ple name into ju
6eb0: 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  st /.**.** Chang
6ec0: 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70  es are made in-p
6ed0: 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68  lace.  Return th
6ee0: 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74  e new name lengt
6ef0: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  h..**.** The ori
6f00: 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
6f10: 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20  s in z[0..n-1]. 
6f20: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6f30: 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  er of.** charact
6f40: 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c  ers in the simpl
6f50: 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  ified name..*/.s
6f60: 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b  tatic int vxwork
6f70: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68  sSimplifyName(ch
6f80: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
6f90: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69   int i, j;.  whi
6fa0: 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31  le( n>1 && z[n-1
6fb0: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]=='/' ){ n--; }
6fc0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
6fd0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
6fe0: 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[i]=='/' ){.  
6ff0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
7000: 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
7010: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
7020: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
7030: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b  & z[i+2]=='/' ){
7040: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b  .        i += 1;
7050: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
7060: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
7070: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
7080: 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69   && i+3<n && z[i
7090: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b  +2]=='.' && z[i+
70a0: 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
70b0: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
70c0: 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20   z[j-1]!='/' ){ 
70d0: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
70e0: 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d  f( j>0 ){ j--; }
70f0: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b  .        i += 2;
7100: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
7110: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
7120: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b  .    z[j++] = z[
7130: 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d  i];.  }.  z[j] =
7140: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a   0;.  return j;.
7150: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
7160: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  unique file ID f
7170: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73  or the given abs
7180: 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20  olute pathname. 
7190: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
71a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f  nter to the vxwo
71b0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
71c0: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20  .  This pointer 
71d0: 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a  is the unique.**
71e0: 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20   file ID..**.** 
71f0: 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f  The nRef field o
7200: 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  f the vxworksFil
7210: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  eId object is in
7220: 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  cremented before
7230: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69  .** the object i
7240: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e  s returned.  A n
7250: 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ew vxworksFileId
7260: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
7270: 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20  ed.** and added 
7280: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69  to the global li
7290: 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  st if necessary.
72a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
72b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
72c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
72d0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
72e0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
72f0: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
7300: 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74  FindFileId(const
7310: 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65   char *zAbsolute
7320: 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Name){.  struct 
7330: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7340: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  New;         /* 
7350: 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e  search key and n
7360: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
7370: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7380: 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65  leId *pCandidate
7390: 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ;   /* For loopi
73a0: 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67  ng over existing
73b0: 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69   file IDs */.  i
73c0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
73f0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74  zAbsoluteName st
7400: 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ring */..  asser
7410: 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  t( zAbsoluteName
7420: 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20  [0]=='/' );.  n 
7430: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  = (int)strlen(zA
7440: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20  bsoluteName);.  
7450: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
7460: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
7470: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
7480: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7490: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
74a0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
74b0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
74c0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
74d0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
74e0: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
74f0: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
7500: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
7510: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
7520: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
7530: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
7540: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
7550: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
7560: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
7570: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
7580: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
7590: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
75a0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
75b0: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
75c0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
75d0: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
75e0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
75f0: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
7600: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
7610: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
7620: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
7630: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7640: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
7650: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
7660: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
7670: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7680: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7690: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
76a0: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
76b0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
76c0: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
76d0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
76e0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
76f0: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
7700: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
7710: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
7720: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
7730: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
7740: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7750: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
7760: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
7770: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
7780: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
7790: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
77a0: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
77b0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
77c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
77d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
77e0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
77f0: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
7800: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7810: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
7820: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
7830: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7840: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
7850: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
7860: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
7870: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
7880: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
7890: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
78a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
78b0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
78c0: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
78d0: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
78e0: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
78f0: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
7900: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
7910: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
7920: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
7930: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
7940: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
7950: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
7960: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
7970: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
7980: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
7990: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
79a0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
79b0: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
79c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
79d0: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
79e0: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
79f0: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
7a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
7a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
7ad0: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
7ae0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
7af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7b00: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
7b10: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
7b20: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
7b30: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
7b40: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
7b50: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
7b60: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
7b70: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
7b80: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
7b90: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
7ba0: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
7bb0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
7bc0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
7bd0: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
7be0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
7bf0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
7c00: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
7c10: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
7c20: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
7c30: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
7c40: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
7c50: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
7c60: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
7c70: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
7c80: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
7c90: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
7ca0: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
7cb0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
7cc0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
7cd0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
7ce0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
7cf0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
7d00: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
7d10: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
7d20: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
7d30: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
7d40: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
7d50: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
7d60: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
7d70: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
7d80: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
7d90: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
7da0: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
7db0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
7dc0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
7dd0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
7de0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
7df0: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
7e00: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
7e10: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
7e20: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
7e30: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
7e40: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
7e50: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
7e60: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
7e70: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
7e80: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
7e90: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
7ea0: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
7eb0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
7ec0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7ed0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
7ee0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
7ef0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
7f00: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
7f10: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
7f20: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
7f30: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
7f40: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
7f50: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
7f60: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
7f70: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
7f80: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
7f90: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
7fa0: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
7fb0: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
7fc0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
7fd0: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
7fe0: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
7ff0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
8000: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
8010: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
8020: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
8030: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
8040: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
8050: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
8060: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
8070: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
8080: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
8090: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
80a0: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
80b0: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
80c0: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
80d0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
80e0: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
80f0: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
8100: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8110: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
8120: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
8130: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
8140: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
8150: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
8160: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
8170: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
8180: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
8190: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
81a0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
81b0: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
81c0: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
81d0: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
81e0: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
81f0: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
8200: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
8210: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
8220: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
8230: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
8240: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
8250: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
8260: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
8270: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
8280: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
8290: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
82a0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
82b0: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
82c0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
82d0: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
82e0: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
82f0: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
8300: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
8310: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
8320: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
8330: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
8340: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
8350: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
8360: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
8370: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
8380: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
8390: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
83a0: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
83b0: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
83c0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
83d0: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
83e0: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
83f0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
8400: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
8410: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
8420: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
8430: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
8440: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
8450: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
8460: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
8470: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
8480: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
8490: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
84a0: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
84b0: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
84c0: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
84d0: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
84e0: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
84f0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
8500: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
8510: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
8520: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
8530: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
8540: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
8550: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
8560: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
8570: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
8580: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
8590: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
85a0: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
85b0: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
85c0: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
85d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
85e0: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
85f0: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
8600: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8610: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
8620: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
8630: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
8640: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
8650: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
8660: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
8670: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
8680: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
8690: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
86a0: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
86b0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
86c0: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
86d0: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
86e0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
86f0: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
8700: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
8710: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
8720: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
8730: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
8740: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
8750: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
8760: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
8770: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
8780: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8790: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
87a0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
87b0: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
87c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
87d0: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
87e0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
87f0: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
8800: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
8810: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
8820: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
8830: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
8840: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
8850: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
8860: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
8870: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
8880: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
8890: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
88a0: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
88b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
88c0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
88d0: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
88e0: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
88f0: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
8900: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
8910: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
8920: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
8930: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
8940: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
8950: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
8960: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
8970: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
8980: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
8990: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
89a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
89b0: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
89c0: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
89d0: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
89e0: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
89f0: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
8a00: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
8a10: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8a20: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
8a30: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
8a40: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
8a50: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
8a60: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
8a70: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
8a80: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
8a90: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
8aa0: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
8ab0: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
8ac0: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
8ad0: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
8ae0: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
8af0: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
8b00: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
8b10: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
8b20: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8b30: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
8b40: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
8b50: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
8b60: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
8b70: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
8b80: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
8b90: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
8ba0: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
8bb0: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
8bc0: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
8bd0: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
8be0: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
8bf0: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
8c00: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
8c10: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
8c20: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8c30: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
8c40: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
8c50: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
8c60: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
8c70: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
8c80: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
8c90: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
8ca0: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
8cb0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
8cc0: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
8cd0: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
8ce0: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
8cf0: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
8d00: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
8d10: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
8d20: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
8d30: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
8d40: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
8d50: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
8d60: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8d70: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
8d80: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
8d90: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
8da0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8db0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
8dc0: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
8dd0: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
8de0: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
8df0: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
8e00: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
8e10: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
8e20: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e40: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
8e50: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
8e60: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
8e70: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
8e80: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
8e90: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
8ea0: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
8eb0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
8ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
8ed0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
8ee0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
8ef0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8f00: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8f10: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
8f20: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
8f30: 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e  * inode.  Or, on
8f40: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74   LinuxThreads, t
8f50: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74  here is one of t
8f60: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
8f70: 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64  for.** each inod
8f80: 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68  e opened by each
8f90: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8fa0: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
8fb0: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
8fc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8fd0: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
8fe0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
8ff0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
9000: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
9010: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
9020: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
9030: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
9040: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
9050: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
9060: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
9070: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
9080: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
9090: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
90a0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
90b0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
90c0: 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20  nt nShared;     
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
90e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
90f0: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
9100: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9110: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
9120: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
9130: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
9140: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
9150: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9160: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20  bProcessLock;   
9170: 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76    /* An exclusiv
9180: 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69  e process lock i
9190: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
91a0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
91c0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
91d0: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
91e0: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
91f0: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
9200: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
9210: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
9220: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
9230: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  node */.  int nL
9240: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
9250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9260: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
9270: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f  ng file locks */
9280: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
9290: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
92a0: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
92b0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
92c0: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78   close */.  unix
92d0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74  InodeInfo *pNext
92e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
92f0: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  ist of all unixI
9300: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9310: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
9320: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
9330: 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e        /*    ....
9340: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
9350: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
9360: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
9370: 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  E.  unsigned lon
9380: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
9390: 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73  e;  /* for AFP s
93a0: 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20  imulated shared 
93b0: 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  lock */.#endif.#
93c0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
93d0: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
9400: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
9410: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
9420: 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a  PATHNAME+2];  /*
9430: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
9440: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
9450: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
9460: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
9470: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
9490: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
94a0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
94b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
94c0: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
94d0: 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76  _x(), is only ev
94e0: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
94f0: 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c  e macro.** unixL
9500: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
9510: 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   It is invoked a
9520: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
9530: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
9540: 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f  nction and errno
9550: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74   has been.** set
9560: 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  . It logs a mess
9570: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
9580: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
9590: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
95a0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f  alue of.** errno
95b0: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
95c0: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
95d0: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
95e0: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
95f0: 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f   or.** strerror_
9600: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  r()..**.** The f
9610: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
9620: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
9630: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
9640: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
9650: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
9660: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
9670: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
9680: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
9690: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
96a0: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
96b0: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
96c0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
96d0: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
96e0: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
96f0: 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c   (e.g. "unlink",
9700: 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65   "open") and the
9710: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
9720: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
9730: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
9740: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
9750: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
9760: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
9770: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
9780: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
9790: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
97a0: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
97d0: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
97e0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
97f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
9800: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
9810: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
9820: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9830: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
9840: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
9850: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
9860: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
9870: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
9880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
9890: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
98a0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
98b0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
98c0: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98e0: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
98f0: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
9900: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
9910: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
9920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
9930: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
9940: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
9950: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
9960: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
9970: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
9980: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
9990: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
99a0: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
99b0: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
99c0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
99d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
99e0: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
99f0: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
9a00: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
9a10: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
9a20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
9a30: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
9a40: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
9a50: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
9a60: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
9a70: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
9a80: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
9a90: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
9aa0: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
9ab0: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
9ac0: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
9ad0: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
9ae0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
9af0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
9b00: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
9b10: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
9b20: 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  that.  ** return
9b30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9b40: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
9b50: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
9b60: 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74  sage. That point
9b70: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69  er .  ** may poi
9b80: 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72  nt to aErr[], or
9b90: 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   it may point to
9ba0: 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f   some static sto
9bb0: 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20  rage somewhere. 
9bc0: 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
9bd0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
9be0: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
9bf0: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
9c00: 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65  on of .  ** stre
9c10: 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20  rror_r(), which 
9c20: 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e  always writes an
9c30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
9c40: 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a  nto aErr[]..  **
9c50: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64  .  ** If the cod
9c60: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73  e incorrectly as
9c70: 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
9c80: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
9c90: 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  on that is.  ** 
9ca0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65  available, the e
9cb0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
9cc0: 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d  l often be an em
9cd0: 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20  pty string. Not 
9ce0: 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62  a.  ** huge prob
9cf0: 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79  lem. Incorrectly
9d00: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74   concluding that
9d10: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
9d20: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20   is available . 
9d30: 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74   ** could lead t
9d40: 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f  o a segfault tho
9d50: 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  ugh..  */.#if de
9d60: 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52  fined(STRERROR_R
9d70: 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69  _CHAR_P) || defi
9d80: 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20  ned(__USE_GNU). 
9d90: 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66   zErr = .# endif
9da0: 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45  .  strerror_r(iE
9db0: 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65  rrno, aErr, size
9dc0: 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65  of(aErr)-1);..#e
9dd0: 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  lif SQLITE_THREA
9de0: 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20  DSAFE.  /* This 
9df0: 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20  is a threadsafe 
9e00: 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72  build, but strer
9e10: 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61  ror_r() is not a
9e20: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a  vailable. */.  z
9e30: 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  Err = "";.#else.
9e40: 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73    /* Non-threads
9e50: 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73  afe build, use s
9e60: 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20  trerror(). */.  
9e70: 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28  zErr = strerror(
9e80: 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a  iErrno);.#endif.
9e90: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
9ea0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
9eb0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
9ec0: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75  ode,.      "os_u
9ed0: 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  nix.c:%d: (%d) %
9ee0: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
9ef0: 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f     iLine, iErrno
9f00: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
9f10: 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zErr.  );..  ret
9f20: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
9f30: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
9f40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
9f50: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
9f60: 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f  hat close() almo
9f70: 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c  st always works,
9f80: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c   since it is onl
9f90: 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73  y in a.** very s
9fa0: 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ick application 
9fb0: 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63  or on a very sic
9fc0: 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20  k platform that 
9fd0: 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a  it might fail..*
9fe0: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69  * If it does fai
9ff0: 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74  l, simply leak t
a000: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
a010: 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74  or, but do log t
a020: 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  he.** error..**.
a030: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
a040: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72  is not safe to r
a050: 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74  etry close() aft
a060: 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74  er EINTR since t
a070: 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  he.** file descr
a080: 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65  iptor might have
a090: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
a0a0: 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20  used by another 
a0b0: 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65  thread..** So we
a0c0: 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20   don't even try 
a0d0: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
a0e0: 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20  an EINTR.  Just 
a0f0: 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  log the error.**
a100: 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f   and move on..*/
a110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62  .static void rob
a120: 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69  ust_close(unixFi
a130: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68  le *pFile, int h
a140: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
a150: 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20   if( osClose(h) 
a160: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  ){.    unixLogEr
a170: 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45  rorAtLine(SQLITE
a180: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63  _IOERR_CLOSE, "c
a190: 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20  lose",.         
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
a1b0: 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61  ile ? pFile->zPa
a1c0: 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b  th : 0, lineno);
a1d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
a1e0: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73  ose all file des
a1f0: 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61  criptors accumua
a200: 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49  ted in the unixI
a210: 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65  nodeInfo->pUnuse
a220: 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74  d list..*/ .stat
a230: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e  ic void closePen
a240: 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65  dingFds(unixFile
a250: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
a260: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
a270: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
a280: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
a290: 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73  d *p;.  UnixUnus
a2a0: 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66  edFd *pNext;.  f
a2b0: 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e  or(p=pInode->pUn
a2c0: 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74  used; p; p=pNext
a2d0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
a2e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62  ->pNext;.    rob
a2f0: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
a300: 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   p->fd, __LINE__
a310: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
a320: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49  ree(p);.  }.  pI
a330: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
a340: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
a350: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
a360: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
a370: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
a380: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
a390: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
a3a0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
a3b0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
a3c0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
a3d0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
a3e0: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
a3f0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
a400: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a410: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
a420: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
a430: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
a440: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
a450: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
a460: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
a470: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
a480: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
a490: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
a4a0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
a4b0: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
a4c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a4d0: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
a4e0: 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 );.      close
a4f0: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
a500: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
a510: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
a520: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a530: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
a540: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
a550: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
a560: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
a570: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
a580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a590: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
a5a0: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
a5b0: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
a5c0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
a5d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a5e0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
a5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a600: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
a610: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
a620: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
a630: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
a640: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
a650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a660: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
a670: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
a680: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
a690: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a6a0: 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69  , locate the uni
a6b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a6c0: 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  t that.** descri
a6d0: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
a6e0: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
a6f0: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
a700: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
a710: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d  * return value m
a720: 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61  ight be uninitia
a730: 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f  lized if an erro
a740: 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  r occurs..**.** 
a750: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
a760: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
a770: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
a780: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
a790: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
a7a0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
a7b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
a7c0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
a7d0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
a7e0: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
a7f0: 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  odeInfo(.  unixF
a800: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
a810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
a820: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
a830: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
a840: 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49  e key */.  unixI
a850: 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f  nodeInfo **ppIno
a860: 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  de        /* Ret
a870: 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  urn the unixInod
a880: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72  eInfo object her
a890: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
a8a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74           /* Syst
a8c0: 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63  em call return c
a8d0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  ode */.  int fd;
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
a900: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
a910: 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74  or pFile */.  st
a920: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
a930: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
a940: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
a950: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
a960: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
a970: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
a980: 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
a990: 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
a9a0: 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  on */.  unixInod
a9b0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a9c0: 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64  0;     /* Candid
a9d0: 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ate unixInodeInf
a9e0: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  o object */..  a
a9f0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
aa00: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
aa10: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
aa20: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
aa30: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
aa40: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
aa50: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
aa60: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
aa70: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
aa80: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
aa90: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
aaa0: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
aab0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  c!=0 ){.    pFil
aac0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
aad0: 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56  rrno;.#ifdef EOV
aae0: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
aaf0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
ab00: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
ab10: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
ab20: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
ab30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
ab40: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
ab50: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
ab60: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
ab70: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
ab80: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
ab90: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
aba0: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
abb0: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
abc0: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
abd0: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
abe0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
abf0: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
ac00: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
ac10: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
ac20: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
ac30: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
ac40: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
ac50: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
ac60: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
ac70: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
ac80: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
ac90: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
aca0: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
acb0: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
acc0: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
acd0: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
ace0: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
acf0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
ad00: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
ad10: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
ad20: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
ad30: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
ad40: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
ad50: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
ad60: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
ad70: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
ad80: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
ad90: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
ada0: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
adb0: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
adc0: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
add0: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
ade0: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
adf0: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
ae00: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
ae10: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
ae20: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
ae30: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
ae40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
ae50: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
ae60: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
ae70: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
ae80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
ae90: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
aea0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
aeb0: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
aec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
aed0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
aee0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
aef0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
af00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
af10: 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  f..  memset(&fil
af20: 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  eId, 0, sizeof(f
af30: 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49  ileId));.  fileI
af40: 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  d.dev = statbuf.
af50: 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56  st_dev;.#if OS_V
af60: 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e  XWORKS.  fileId.
af70: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
af80: 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64  ;.#else.  fileId
af90: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
afa0: 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20  t_ino;.#endif.  
afb0: 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
afc0: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  st;.  while( pIn
afd0: 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66  ode && memcmp(&f
afe0: 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e  ileId, &pInode->
aff0: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
b000: 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70  ileId)) ){.    p
b010: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
b020: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
b030: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
b040: 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74    pInode = sqlit
b050: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
b060: 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20  f(*pInode) );.  
b070: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
b080: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b090: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b0a0: 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
b0b0: 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Inode, 0, sizeof
b0c0: 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20  (*pInode));.    
b0d0: 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e  memcpy(&pInode->
b0e0: 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c  fileId, &fileId,
b0f0: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
b100: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  ;.    pInode->nR
b110: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f  ef = 1;.    pIno
b120: 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64  de->pNext = inod
b130: 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64  eList;.    pInod
b140: 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  e->pPrev = 0;.  
b150: 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20    if( inodeList 
b160: 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72  ) inodeList->pPr
b170: 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20  ev = pInode;.   
b180: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
b190: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
b1a0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b    pInode->nRef++
b1b0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65  ;.  }.  *ppInode
b1c0: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74   = pInode;.  ret
b1d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b1e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
b1f0: 52 55 45 20 69 66 20 70 46 69 6c 65 20 68 61 73  RUE if pFile has
b200: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
b210: 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65 20   unlinked since 
b220: 69 74 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  it was first ope
b230: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
b240: 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28  nt fileHasMoved(
b250: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
b260: 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
b270: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
b280: 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 20 70 46  >pInode!=0 && pF
b290: 69 6c 65 2d 3e 70 49 64 21 3d 70 46 69 6c 65 2d  ile->pId!=pFile-
b2a0: 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  >pInode->fileId.
b2b0: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  pId;.#else.  str
b2c0: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
b2d0: 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49  return pFile->pI
b2e0: 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20 20 20 20  node!=0 &&.     
b2f0: 20 28 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e   (osStat(pFile->
b300: 7a 50 61 74 68 2c 20 26 62 75 66 29 21 3d 30 20  zPath, &buf)!=0 
b310: 7c 7c 20 62 75 66 2e 73 74 5f 69 6e 6f 21 3d 70  || buf.st_ino!=p
b320: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69  File->pInode->fi
b330: 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69  leId.ino);.#endi
b340: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
b350: 6b 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61  k a unixFile tha
b360: 74 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e  t is a database.
b370: 20 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c    Verify the fol
b380: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31  lowing:.**.** (1
b390: 29 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  ) There is exact
b3a0: 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b  ly one hard link
b3b0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
b3c0: 28 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20  (2) The file is 
b3d0: 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c  not a symbolic l
b3e0: 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66  ink.** (3) The f
b3f0: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
b400: 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69   renamed or unli
b410: 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65  nked.**.** Issue
b420: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b430: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29  ITE_WARNING,...)
b440: 20 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79   messages if any
b450: 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67  thing is not rig
b460: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ht..*/.static vo
b470: 69 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  id verifyDbFile(
b480: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
b490: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  {.  struct stat 
b4a0: 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  buf;.  int rc;. 
b4b0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
b4c0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
b4d0: 5f 57 41 52 4e 45 44 20 29 7b 0a 20 20 20 20 2f  _WARNED ){.    /
b4e0: 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  * One or more of
b4f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
b500: 61 72 6e 69 6e 67 73 20 68 61 76 65 20 61 6c 72  arnings have alr
b510: 65 61 64 79 20 62 65 65 6e 20 69 73 73 75 65 64  eady been issued
b520: 2e 20 20 44 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  .  Do not.    **
b530: 20 72 65 70 65 61 74 20 74 68 65 6d 20 73 6f 20   repeat them so 
b540: 61 73 20 6e 6f 74 20 74 6f 20 63 6c 75 74 74 65  as not to clutte
b550: 72 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 20  r the error log 
b560: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
b570: 20 7d 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61   }.  rc = osFsta
b580: 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
b590: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
b5a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b5b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b5c0: 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20  , "cannot fstat 
b5d0: 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69  db file %s", pFi
b5e0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
b5f0: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
b600: 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52   |= UNIXFILE_WAR
b610: 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  NED;.    return;
b620: 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73  .  }.  if( buf.s
b630: 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70  t_nlink==0 && (p
b640: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b650: 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  & UNIXFILE_DELET
b660: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)==0 ){.    sql
b670: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b680: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75  WARNING, "file u
b690: 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70  nlinked while op
b6a0: 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  en: %s", pFile->
b6b0: 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c  zPath);.    pFil
b6c0: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
b6d0: 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b  UNIXFILE_WARNED;
b6e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b6f0: 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c  .  if( buf.st_nl
b700: 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  ink>1 ){.    sql
b710: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b720: 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70  WARNING, "multip
b730: 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65  le links to file
b740: 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  : %s", pFile->zP
b750: 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ath);.    pFile-
b760: 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
b770: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20  IXFILE_WARNED;. 
b780: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b790: 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65   if( fileHasMove
b7a0: 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  d(pFile) ){.    
b7b0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b7c0: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
b7d0: 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20  e renamed while 
b7e0: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
b7f0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46  ->zPath);.    pF
b800: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
b810: 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  = UNIXFILE_WARNE
b820: 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  D;.    return;. 
b830: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
b840: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
b850: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
b860: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
b870: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
b880: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
b890: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
b8a0: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
b8b0: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
b8c0: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
b8d0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
b8e0: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
b8f0: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
b900: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
b910: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
b920: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
b930: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
b940: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
b950: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
b960: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b970: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
b980: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
b990: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
b9a0: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
b9b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
b9c0: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
b9d0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
b9e0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
b9f0: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
ba00: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
ba10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
ba20: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
ba30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
ba40: 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  le );.  unixEnte
ba50: 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
ba60: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
ba70: 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
ba80: 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a  oss threads */..
ba90: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
baa0: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
bab0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
bac0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
bad0: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
bae0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
baf0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
bb00: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
bb10: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
bb20: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
bb30: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
bb40: 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  it..  */.#ifndef
bb50: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28   __DJGPP__.  if(
bb60: 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70   !reserved && !p
bb70: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
bb80: 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20  rocessLock ){.  
bb90: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
bba0: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ock;.    lock.l_
bbb0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
bbc0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
bbd0: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
bbe0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
bbf0: 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  len = 1;.    loc
bc00: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
bc10: 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63  CK;.    if( osFc
bc20: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
bc30: 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b  GETLK, &lock) ){
bc40: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
bc50: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
bc60: 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20  SERVEDLOCK;.    
bc70: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
bc80: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
bc90: 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e  } else if( lock.
bca0: 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20  l_type!=F_UNLCK 
bcb0: 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  ){.      reserve
bcc0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
bcd0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69  .#endif.  .  uni
bce0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
bcf0: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
bd00: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
bd10: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
bd20: 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
bd30: 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
bd40: 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
bd50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bd60: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
bd70: 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b  et a system-lock
bd80: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69   on the file pFi
bd90: 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  le.  The lock is
bda0: 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62   .** described b
bdb0: 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  y pLock..**.** I
bdc0: 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73 20  f the pFile was 
bdd0: 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74  opened read/writ
bde0: 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c  e from unix-excl
bdf0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20  , then the only 
be00: 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74  lock.** ever obt
be10: 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c  ained is an excl
be20: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20  usive lock, and 
be30: 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65  it is obtained e
be40: 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74  xactly once.** t
be50: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e  he first time an
be60: 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70  y lock is attemp
be70: 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71  ted.  All subseq
be80: 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b  uent system lock
be90: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
bea0: 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e  s become no-ops.
beb0: 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74    Locking operat
bec0: 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65  ions still happe
bed0: 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a  n internally,.**
bee0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f   in order to coo
bef0: 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20 62  rdinate access b
bf00: 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65 20  etween separate 
bf10: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
bf20: 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ions.** within t
bf30: 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74  his process, but
bf40: 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20   all of that is 
bf50: 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72  handled in memor
bf60: 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65  y and the.** ope
bf70: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f  rating system do
bf80: 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61  es not participa
bf90: 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  te..**.** This f
bfa0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73  unction is a pas
bfb0: 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e  s-through to fcn
bfc0: 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70  tl(F_SETLK) if p
bfd0: 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a  File is using.**
bfe0: 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74   any VFS other t
bff0: 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  han "unix-excl" 
c000: 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f  or if pFile is o
c010: 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65  pened on "unix-e
c020: 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72  xcl".** and is r
c030: 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ead-only..**.** 
c040: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
c050: 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d   if the call com
c060: 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75  pletes successfu
c070: 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20  lly, or -1 if a 
c080: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c  call.** to fcntl
c090: 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69  () fails. In thi
c0a0: 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73  s case, errno is
c0b0: 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65   set appropriate
c0c0: 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e  ly (by fcntl()).
c0d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
c0e0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78  nixFileLock(unix
c0f0: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72  File *pFile, str
c100: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b  uct flock *pLock
c110: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
c120: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
c130: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
c140: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
c150: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
c160: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
c170: 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ode!=0 );.  if( 
c180: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
c190: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58  gs & UNIXFILE_EX
c1a0: 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65  CL)!=0 || pInode
c1b0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a  ->bProcessLock).
c1c0: 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63     && ((pFile->c
c1d0: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
c1e0: 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a  ILE_RDONLY)==0).
c1f0: 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e    ){.    if( pIn
c200: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
c210: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  k==0 ){.      st
c220: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
c230: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c240: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
c250: 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  );.      lock.l_
c260: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
c270: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
c280: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
c290: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
c2a0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
c2b0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  SIZE;.      lock
c2c0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
c2d0: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  K;.      rc = os
c2e0: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
c2f0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
c300: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20  .      if( rc<0 
c310: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c320: 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63     pInode->bProc
c330: 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  essLock = 1;.   
c340: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
c350: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
c360: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
c370: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
c380: 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69  rc = osFcntl(pFi
c390: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
c3a0: 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  pLock);.  }.  re
c3b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c3c0: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
c3d0: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
c3e0: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
c3f0: 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
c400: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
c410: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
c420: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
c430: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
c440: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
c450: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
c460: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
c470: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
c480: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
c490: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
c4a0: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
c4b0: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
c4c0: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
c4d0: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
c4e0: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
c4f0: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
c500: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
c510: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
c520: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
c530: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
c540: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
c550: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
c560: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
c570: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
c580: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
c590: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
c5a0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
c5b0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
c5c0: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
c5d0: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
c5e0: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
c5f0: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
c600: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
c610: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
c620: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
c630: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
c640: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
c650: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
c660: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
c670: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c680: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
c690: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
c6a0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
c6b0: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
c6c0: 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
c6d0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
c6e0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
c6f0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
c700: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
c710: 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66  ock){.  /* The f
c720: 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62  ollowing describ
c730: 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  es the implement
c740: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72  ation of the var
c750: 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20  ious locks and. 
c760: 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74   ** lock transit
c770: 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66  ions in terms of
c780: 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73   the POSIX advis
c790: 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65  ory shared and e
c7a0: 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f  xclusive.  ** lo
c7b0: 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63  ck primitives (c
c7c0: 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73  alled read-locks
c7d0: 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73   and write-locks
c7e0: 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64   below, to avoid
c7f0: 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20  .  ** confusion 
c800: 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b  with SQLite lock
c810: 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67   names). The alg
c820: 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70  orithms are comp
c830: 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69  licated.  ** sli
c840: 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ghtly in order t
c850: 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  o be compatible 
c860: 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73  with windows sys
c870: 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75  tems simultaneou
c880: 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69  sly.  ** accessi
c890: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
c8a0: 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61  base file, in ca
c8b0: 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20  se that is ever 
c8c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
c8d0: 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69   ** Symbols defi
c8e0: 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65  ned in os.h inde
c8f0: 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69  ntify the 'pendi
c900: 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65  ng byte' and the
c910: 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20   'reserved.  ** 
c920: 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67  byte', each sing
c930: 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c  le bytes at well
c940: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20   known offsets, 
c950: 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20  and the 'shared 
c960: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c970: 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30  , a range of 510
c980: 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c   bytes at a well
c990: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20   known offset.. 
c9a0: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61   **.  ** To obta
c9b0: 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
c9c0: 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  , a read-lock is
c9d0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
c9e0: 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62   'pending.  ** b
c9f0: 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69  yte'.  If this i
ca00: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  s successful, a 
ca10: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
ca20: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
ca30: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
ca40: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64   read-locked and
ca50: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
ca60: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
ca70: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20  released..  **. 
ca80: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
ca90: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
caa0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66  RESERVED lock af
cab0: 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41  ter it has a SHA
cac0: 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41  RED lock..  ** A
cad0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
cae0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
caf0: 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74   grabbing a writ
cb00: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e-lock on the.  
cb10: 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74  ** 'reserved byt
cb20: 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  e'. .  **.  ** A
cb30: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
cb40: 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49  y obtain a PENDI
cb50: 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  NG lock after it
cb60: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a   has obtained a.
cb70: 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b    ** SHARED lock
cb80: 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  . A PENDING lock
cb90: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
cba0: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
cbb0: 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  rite-lock.  ** o
cbc0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
cbd0: 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72  yte'. This ensur
cbe0: 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53  es that no new S
cbf0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20  HARED locks can 
cc00: 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  be.  ** obtained
cc10: 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53  , but existing S
cc20: 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20  HARED locks are 
cc30: 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69  allowed to persi
cc40: 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20  st. A process.  
cc50: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ** does not have
cc60: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53   to obtain a RES
cc70: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
cc80: 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49  e way to a PENDI
cc90: 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68  NG lock..  ** Th
cca0: 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  is property is u
ccb0: 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72  sed by the algor
ccc0: 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67  ithm for rolling
ccd0: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
cce0: 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  file.  ** after 
ccf0: 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20  a crash..  **.  
cd00: 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  ** An EXCLUSIVE 
cd10: 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61  lock, obtained a
cd20: 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c  fter a PENDING l
cd30: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a  ock is held, is.
cd40: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64    ** implemented
cd50: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
cd60: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
cd70: 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64  e entire 'shared
cd80: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
cd90: 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68  '. Since all oth
cda0: 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  er locks require
cdb0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
cdc0: 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73  one of the bytes
cdd0: 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  .  ** within thi
cde0: 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e  s range, this en
cdf0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74  sures that no ot
ce00: 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  her locks are he
ce10: 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ld on the.  ** d
ce20: 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20  atabase. .  **. 
ce30: 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61   ** The reason a
ce40: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e   single byte can
ce50: 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  not be used inst
ce60: 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72  ead of the 'shar
ce70: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
ce80: 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65  ge' is that some
ce90: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e   versions of win
cea0: 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70  dows do not supp
ceb0: 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20  ort read-locks. 
cec0: 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20  By.  ** locking 
ced0: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
cee0: 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63  om a range, conc
cef0: 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f  urrent SHARED lo
cf00: 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20  cks may exist.  
cf10: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c  ** even if the l
cf20: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
cf30: 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20   used is always 
cf40: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20  a write-lock..  
cf50: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
cf60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
cf70: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
cf80: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
cf90: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
cfa0: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
cfb0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
cfc0: 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  tErrno = 0;..  a
cfd0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
cfe0: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
cff0: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
d000: 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
d010: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
d020: 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  >h,.      azFile
d030: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
d040: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
d050: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
d060: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
d070: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
d080: 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65  FileLock), pFile
d090: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
d0a0: 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
d0b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
d0c0: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
d0d0: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
d0e0: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
d0f0: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
d100: 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
d110: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
d120: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
d130: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
d140: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
d150: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
d160: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
d170: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
d180: 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
d190: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
d1a0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
d1b0: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
d1c0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
d1d0: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
d1e0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
d1f0: 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
d200: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d210: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
d220: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
d230: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
d240: 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57  ect..  **  (1) W
d250: 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
d260: 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
d270: 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
d280: 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
d290: 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
d2a0: 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
d2b0: 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
d2c0: 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
d2d0: 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
d2e0: 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
d2f0: 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
d300: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d310: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
d320: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d330: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
d340: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d350: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
d360: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
d370: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
d380: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
d390: 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
d3a0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
d3b0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
d3c0: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
d3d0: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
d3e0: 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
d3f0: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
d400: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
d410: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
d420: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
d430: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
d440: 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
d450: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
d460: 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
d470: 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
d480: 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
d490: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
d4a0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
d4b0: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
d4c0: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
d4d0: 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
d4e0: 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
d4f0: 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
d500: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d510: 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
d520: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
d530: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
d540: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  .  ){.    rc = S
d550: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
d560: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
d570: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48   }..  /* If a SH
d580: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
d590: 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
d5a0: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
d5b0: 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
d5c0: 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
d5d0: 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
d5e0: 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
d5f0: 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
d600: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
d610: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
d620: 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
d630: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d640: 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64  && .      (pInod
d650: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
d660: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
d670: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
d680: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
d690: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
d6a0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d6b0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
d6c0: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
d6d0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
d6e0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
d6f0: 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
d700: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d710: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
d720: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
d730: 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
d740: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
d750: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
d760: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44   }...  /* A PEND
d770: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
d780: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
d790: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
d7a0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
d7b0: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
d7c0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
d7d0: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
d7e0: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
d7f0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
d800: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c  leased..  */.  l
d810: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
d820: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d830: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66  = SEEK_SET;.  if
d840: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
d850: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
d860: 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
d870: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
d880: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d890: 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
d8a0: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
d8b0: 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63  type = (eFileLoc
d8c0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  k==SHARED_LOCK?F
d8d0: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
d8e0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
d8f0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
d900: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
d910: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
d920: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
d930: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
d940: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
d950: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
d960: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
d970: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
d980: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d990: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
d9a0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d9b0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
d9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
d9d0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
d9e0: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
d9f0: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
da00: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
da10: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
da20: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
da30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
da40: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
da50: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
da60: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
da70: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
da80: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
da90: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
daa0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
dab0: 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
dac0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
dad0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
dae0: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
daf0: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
db00: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
db10: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
db20: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
db30: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
db40: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20  D_SIZE;.    if( 
db50: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
db60: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
db70: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
db80: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
db90: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
dba0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
dbb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
dbc0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK);.    }..    
dbd0: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
dbe0: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
dbf0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
dc00: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
dc10: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
dc20: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
dc30: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
dc40: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75  UNLCK;.    if( u
dc50: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
dc60: 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d  e, &lock) && rc=
dc70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dc80: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
dc90: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
dca0: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
dcb0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
dcc0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
dcd0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
dce0: 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20  NLOCK; .    }.. 
dcf0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
dd00: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
dd10: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
dd20: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
dd30: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
dd40: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
dd50: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65  end_lock;.    }e
dd60: 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
dd70: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
dd80: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
dd90: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
dda0: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
ddb0: 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
ddc0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
ddd0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
dde0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
ddf0: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
de00: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
de10: 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
de20: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
de30: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
de40: 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
de50: 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
de60: 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
de70: 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
de80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
de90: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
dea0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
deb0: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
dec0: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
ded0: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
dee0: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
def0: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
df00: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
df10: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
df20: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
df30: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
df40: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
df50: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63  eLock );.    loc
df60: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
df70: 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  CK;..    assert(
df80: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
df90: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  RVED_LOCK || eFi
dfa0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
dfb0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66  E_LOCK );.    if
dfc0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
dfd0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
dfe0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
dff0: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
e000: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
e010: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c  en = 1L;.    }el
e020: 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  se{.      lock.l
e030: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
e040: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
e050: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
e060: 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _SIZE;.    }..  
e070: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e080: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e090: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
e0a0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e0b0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e0c0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e0d0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e0e0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
e0f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e100: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
e110: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e120: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
e130: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
e140: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
e150: 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70  EBUG.  /* Set up
e160: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e170: 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20  -counter change 
e180: 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77  checking flags w
e190: 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74  hen.  ** transit
e1a0: 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48  ioning from a SH
e1b0: 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56  ARED to a RESERV
e1c0: 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68  ED lock.  The ch
e1d0: 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53  ange.  ** from S
e1e0: 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
e1f0: 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69  D marks the begi
e200: 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61  nning of a norma
e210: 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65  l.  ** write ope
e220: 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f  ration (not a ho
e230: 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t journal rollba
e240: 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ck)..  */.  if( 
e250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
e260: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
e270: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
e280: 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63  K.   && eFileLoc
e290: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
e2a0: 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  .  ){.    pFile-
e2b0: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
e2c0: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   0;.    pFile->d
e2d0: 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
e2e0: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
e2f0: 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23  Write = 1;.  }.#
e300: 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63  endif...  if( rc
e310: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e320: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
e330: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
e340: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
e350: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
e360: 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
e370: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
e380: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
e390: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e3a0: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
e3b0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
e3c0: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
e3d0: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
e3e0: 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
e3f0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
e400: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
e410: 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
e420: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
e430: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
e440: 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
e450: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
e460: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
e470: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e480: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
e490: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
e4a0: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
e4b0: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
e4c0: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
e4d0: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
e4e0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
e4f0: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
e500: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
e510: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
e520: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e530: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
e540: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55  d *p = pFile->pU
e550: 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78  nused;.  p->pNex
e560: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
e570: 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
e580: 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
e590: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
e5a0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  File->pUnused = 
e5b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  0;.}../*.** Lowe
e5c0: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
e5d0: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
e5e0: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
e5f0: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
e600: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
e610: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
e620: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
e630: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
e640: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
e650: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
e660: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
e670: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
e680: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
e690: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
e6a0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
e6b0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64  ..** .** If hand
e6c0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74  leNFSUnlock is t
e6d0: 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77  rue, then on dow
e6e0: 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c  ngrading an EXCL
e6f0: 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48  USIVE_LOCK to SH
e700: 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65  ARED.** the byte
e710: 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65   range is divide
e720: 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61  d into 2 parts a
e730: 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72  nd the first par
e740: 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68  t is unlocked th
e750: 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72  en.** set to a r
e760: 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ead lock, then t
e770: 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73  he other part is
e780: 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64   simply unlocked
e790: 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a  .  This works .*
e7a0: 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69  * around a bug i
e7b0: 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20  n BSD NFS lockd 
e7c0: 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61  (also seen on Ma
e7d0: 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74  cOSX 10.3+) that
e7e0: 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65   fails to .** re
e7f0: 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c  move the write l
e800: 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20  ock on a region 
e810: 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
e820: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   is set..*/.stat
e830: 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f  ic int posixUnlo
e840: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
e850: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
e860: 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46  ck, int handleNF
e870: 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78  SUnlock){.  unix
e880: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
e890: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
e8a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
e8b0: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
e8c0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
e8d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e8e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
e8f0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
e900: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
e910: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
e920: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
e930: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
e940: 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ck,.      pFile-
e950: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
e960: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
e970: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
e980: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
e990: 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
e9a0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
e9b0: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
e9c0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
e9d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
e9e0: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
e9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ea00: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
ea10: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
ea20: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
ea30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
ea40: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
ea50: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
ea60: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
ea70: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
ea80: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
ea90: 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
eaa0: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64  ileLock );..#ifd
eab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
eac0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
ead0: 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
eae0: 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
eaf0: 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
eb00: 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
eb10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
eb20: 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
eb30: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
eb40: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
eb50: 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
eb60: 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
eb70: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
eb80: 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
eb90: 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
eba0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
ebb0: 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
ebc0: 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
ebd0: 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
ebe0: 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
ebf0: 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
ec00: 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
ec10: 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
ec20: 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
ec30: 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
ec40: 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
ec50: 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
ec60: 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
ec70: 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
ec80: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
ec90: 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   */.    pFile->i
eca0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
ecb0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
ecc0: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20   downgrading to 
ecd0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
ece0: 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c   NFS involves cl
ecf0: 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65  earing the write
ed00: 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66   lock.    ** bef
ed10: 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67  ore establishing
ed20: 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20   the readlock - 
ed30: 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20  to avoid a race 
ed40: 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77  condition we dow
ed50: 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68  ngrade.    ** th
ed60: 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63  e lock in 2 bloc
ed70: 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74  ks, so that part
ed80: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69   of the range wi
ed90: 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79  ll be covered by
eda0: 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65   a .    ** write
edb0: 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20   lock until the 
edc0: 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20  rest is covered 
edd0: 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a  by a read lock:.
ede0: 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57      **  1:   [WW
edf0: 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20  WWW].    **  2: 
ee00: 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a    [....W].    **
ee10: 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20    3:   [RRRRW]. 
ee20: 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52     **  4:   [RRR
ee30: 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  R.].    */.    i
ee40: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
ee50: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69  ARED_LOCK ){..#i
ee60: 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  f !defined(__APP
ee70: 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45  LE__) || !SQLITE
ee80: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
ee90: 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69  STYLE.      (voi
eea0: 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  d)handleNFSUnloc
eeb0: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
eec0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
eed0: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
eee0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
eef0: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
ef00: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
ef10: 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
ef20: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
ef30: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
ef40: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
ef50: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
ef60: 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
ef70: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
ef80: 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a      off_t divSiz
ef90: 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e = SHARED_SIZE 
efa0: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  - 1;.        .  
efb0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
efc0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
efd0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
efe0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
eff0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f000: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f010: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
f020: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
f030: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f040: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f050: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
f060: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
f070: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f080: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f090: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
f0a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
f0b0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
f0c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f0d0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f0e0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f100: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f120: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f130: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
f140: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f150: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f160: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f170: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
f180: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f190: 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
f1a0: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
f1b0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f1c0: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
f1d0: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
f1e0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
f1f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
f200: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
f210: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
f220: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
f230: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
f240: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
f250: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f260: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f270: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f280: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f290: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f2a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f2c0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
f2d0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f2e0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f2f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f300: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
f310: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
f320: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
f330: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
f340: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
f350: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f360: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
f370: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
f380: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f390: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f3a0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
f3b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
f3c0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
f3d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f3e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f3f0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
f400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f410: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f420: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f430: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
f440: 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
f450: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
f460: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
f470: 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  YLE */.      {. 
f480: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f490: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
f4a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f4b0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f4c0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f4d0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f4e0: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
f4f0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f500: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
f510: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f520: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
f530: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
f540: 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
f550: 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
f560: 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
f570: 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
f580: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
f590: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
f5a0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
f5b0: 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
f5c0: 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
f5d0: 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
f5e0: 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
f5f0: 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
f600: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
f610: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
f620: 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
f630: 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
f640: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
f650: 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
f660: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
f670: 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
f680: 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
f690: 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
f6a0: 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
f6b0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
f6c0: 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
f6d0: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
f6e0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
f6f0: 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
f700: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f710: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f720: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
f730: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
f740: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f750: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f760: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
f770: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f780: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
f790: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
f7a0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
f7b0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
f7c0: 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
f7d0: 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
f7e0: 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
f7f0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f800: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
f810: 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
f820: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
f830: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
f840: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
f850: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f860: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
f870: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
f880: 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  no;.      goto e
f890: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d  nd_unlock;.    }
f8a0: 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65  .  }.  if( eFile
f8b0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
f8c0: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
f8d0: 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
f8e0: 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
f8f0: 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
f900: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
f910: 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
f920: 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
f930: 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
f940: 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
f950: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
f960: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
f970: 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20  ->nShared--;.   
f980: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68   if( pInode->nSh
f990: 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ared==0 ){.     
f9a0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f9b0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f  _UNLCK;.      lo
f9c0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
f9d0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
f9e0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63  ck.l_start = loc
f9f0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20  k.l_len = 0L;.  
fa00: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
fa10: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
fa20: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
fa30: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
fa40: 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
fa50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fa60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
fa70: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
fa80: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
fa90: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
faa0: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
fab0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
fac0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
fad0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
fae0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
faf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
fb00: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
fb10: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
fb20: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
fb30: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
fb40: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
fb50: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
fb60: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
fb70: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
fb80: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
fb90: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
fba0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
fbb0: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
fbc0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
fbd0: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
fbe0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
fbf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
fc00: 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
fc10: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
fc20: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
fc30: 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f   }.  }..end_unlo
fc40: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
fc50: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
fc60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
fc70: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
fc80: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
fc90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
fca0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
fcb0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
fcc0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
fcd0: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
fce0: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
fcf0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
fd00: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
fd10: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
fd20: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
fd30: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
fd40: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
fd50: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
fd60: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
fd70: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
fd80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
fd90: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
fda0: 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b  c int unixUnlock
fdb0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fdc0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
fdd0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
fde0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
fdf0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
fe00: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
fe10: 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  | ((unixFile *)i
fe20: 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  d)->nFetchOut==0
fe30: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
fe40: 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
fe50: 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
fe60: 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
fe70: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
fe80: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
fe90: 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
fea0: 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65   *pFd, i64 nByte
feb0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  );.static void u
fec0: 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
fed0: 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e  xFile *pFd);.#en
fee0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
fef0: 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
ff00: 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74  s the parts of t
ff10: 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20  he "close file" 
ff20: 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f  operation .** co
ff30: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
ff40: 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20  ing schemes. It 
ff50: 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63  closes the direc
ff60: 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a  tory and file.**
ff70: 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65   handles, if the
ff80: 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64  y are valid, and
ff90: 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73   sets all fields
ffa0: 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
ffb0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f  .** structure to
ffc0: 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20   0..**.** It is 
ffd0: 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20  *not* necessary 
ffe0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
fff0: 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  x when this rout
10000 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ine is called,.*
10010 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b  * even on VxWork
10020 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c  s.  A mutex will
10030 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20   be acquired on 
10040 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a  VxWorks by the.*
10050 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  * vxworksRelease
10060 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65  FileId() routine
10070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10080 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71  closeUnixFile(sq
10090 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
100a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
100b0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
100c0 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  id;.#if SQLITE_M
100d0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
100e0 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
100f0 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  File);.#endif.  
10100 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
10110 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  ){.    robust_cl
10120 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
10130 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
10140 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
10150 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58  1;.  }.#if OS_VX
10160 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c  WORKS.  if( pFil
10170 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66  e->pId ){.    if
10180 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
10190 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
101a0 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73  LETE ){.      os
101b0 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49  Unlink(pFile->pI
101c0 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
101d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78  e);.    }.    vx
101e0 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
101f0 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
10200 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
10210 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
10220 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c  ifdef SQLITE_UNL
10230 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a  INK_AFTER_CLOSE.
10240 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
10250 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
10260 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
10270 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
10280 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  zPath);.    sqli
10290 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a  te3_free(*(char*
102a0 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  *)&pFile->zPath)
102b0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61  ;.    pFile->zPa
102c0 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  th = 0;.  }.#end
102d0 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
102e0 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
102f0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
10300 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
10310 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
10320 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  ile->pUnused);. 
10330 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
10340 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
10350 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
10360 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10370 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
10380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
10390 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
103a0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
103b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
103c0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
103d0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
103e0 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46  )id;.  verifyDbF
103f0 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e  ile(pFile);.  un
10400 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
10410 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
10420 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
10430 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
10440 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
10450 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
10460 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
10470 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ose.  ** routine
10480 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f   (e.g. nolockClo
10490 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63  se()) would be c
104a0 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  alled instead.. 
104b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
104c0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
104d0 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
104e0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
104f0 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ock==0 );.  if( 
10500 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49  ALWAYS(pFile->pI
10510 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e  node) && pFile->
10520 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
10530 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
10540 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
10550 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
10560 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
10570 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
10580 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
10590 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
105a0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
105b0 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
105c0 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
105d0 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
105e0 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
105f0 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
10600 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
10610 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
10620 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
10630 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
10640 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
10650 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
10660 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
10670 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ile);.  rc = clo
10680 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
10690 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
106a0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
106b0 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
106c0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
106d0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
106e0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
106f0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
10700 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10750 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
10760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107a0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107c0 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
107d0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
107e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107f0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
10800 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
10810 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
10820 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
10830 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
10840 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
10850 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
10860 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
10870 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
10880 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
10890 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
108a0 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
108b0 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
108c0 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
108d0 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
108e0 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
108f0 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
10900 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
10910 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
10920 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
10930 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
10940 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
10950 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
10960 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
10970 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
10980 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
10990 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
109a0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
109b0 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
109c0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
109d0 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
109e0 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
109f0 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
10a00 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
10a10 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
10a20 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
10a30 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
10a40 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
10a50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
10a60 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
10a70 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10a80 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
10a90 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
10aa0 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
10ab0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
10ac0 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
10ad0 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10ae0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
10af0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10b00 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
10b10 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
10b20 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
10b30 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
10b40 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
10b50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
10b60 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
10b70 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10b80 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
10b90 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
10ba0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
10bb0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
10bc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10bd0 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
10be0 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
10bf0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
10c00 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
10c10 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
10c20 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
10c30 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
10c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
10c60 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
10c70 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
10c80 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
10c90 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
10ca0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
10cb0 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
10cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
10cd0 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
10ce0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d00 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d50 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10da0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
10dd0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
10e00 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10e10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10e20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e  uses the existen
10e30 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
10e40 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65  ock.** files (re
10e50 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
10e60 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  ) to control acc
10e70 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
10e80 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ase.  This works
10e90 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75  .** on just abou
10ea0 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74  t every filesyst
10eb0 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20  em imaginable.  
10ec0 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65  But there are se
10ed0 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a  rious downsides:
10ee0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
10ef0 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e  here is zero con
10f00 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e  currency.  A sin
10f10 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b  gle reader block
10f20 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20  s all other.**  
10f30 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
10f40 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20  ns from reading 
10f50 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  or writing the d
10f60 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
10f70 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63    (2)  An applic
10f80 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70  ation crash or p
10f90 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65  ower loss can le
10fa0 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66  ave stale lock f
10fb0 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  iles.**         
10fc0 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74  sitting around t
10fd0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hat need to be c
10fe0 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e  leared manually.
10ff0 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c  .**.** Neverthel
11000 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69  ess, a dotlock i
11010 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
11020 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f   locking mode fo
11030 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f  r use if no.** o
11040 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72  ther locking str
11050 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62  ategy is availab
11060 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c  le..**.** Dotfil
11070 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20  e locking works 
11080 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75  by creating a su
11090 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68  bdirectory in th
110a0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
110b0 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   as.** the datab
110c0 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
110d0 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
110e0 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
110f0 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
11100 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20  * The existence 
11110 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74  of a lock direct
11120 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45  ory implies an E
11130 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
11140 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63  All other.** loc
11150 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c  k types (SHARED,
11160 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49   RESERVED, PENDI
11170 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69  NG) are mapped i
11180 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  nto EXCLUSIVE..*
11190 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  /../*.** The fil
111a0 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74  e suffix added t
111b0 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20  o the data base 
111c0 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65  filename in orde
111d0 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  r to create the.
111e0 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  ** lock director
111f0 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  y..*/.#define DO
11200 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
11210 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
11220 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
11230 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
11240 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
11250 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
11260 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
11270 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
11280 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
11290 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
112a0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
112b0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
112c0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
112d0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
112e0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
112f0 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
11300 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
11310 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
11320 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
11330 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
11340 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
11350 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
11360 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
11370 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
11380 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
11390 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
113a0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
113b0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
113c0 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
113d0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
113e0 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
113f0 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
11400 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
11410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
11420 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
11430 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
11440 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
11450 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
11460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11470 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
11480 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
11490 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
114a0 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
114b0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
114c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
114d0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
114e0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
114f0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
11500 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
11510 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
11520 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
11530 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
11540 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
11550 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
11560 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
11570 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
11580 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
11590 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
115a0 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
115b0 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
115c0 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
115d0 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
115e0 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
115f0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
11600 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
11610 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
11620 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
11630 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
11640 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11650 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
11660 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
11670 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
11680 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
11690 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
116a0 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
116b0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
116c0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
116d0 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
116e0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
116f0 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
11700 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
11710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11720 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
11730 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
11740 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
11750 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
11760 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
11770 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
11780 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11790 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
117a0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
117b0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
117c0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
117d0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
117e0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
117f0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11800 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11810 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
11820 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
11830 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
11840 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
11850 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
11860 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
11870 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
11880 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
11890 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
118a0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
118b0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
118c0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
118d0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
118e0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
118f0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
11900 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
11910 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
11920 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
11930 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
11940 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
11950 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
11960 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
11970 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11980 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11990 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
119a0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
119b0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
119c0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
119d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
119e0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
119f0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
11a00 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
11a10 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
11a20 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
11a30 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
11a40 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
11a50 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
11a60 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
11a70 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
11a80 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
11a90 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
11aa0 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
11ab0 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
11ac0 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
11ad0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
11ae0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
11af0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
11b00 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11b10 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
11b20 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
11b30 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
11b40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11b50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11b60 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
11b70 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
11b80 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
11b90 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
11ba0 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
11bb0 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
11bc0 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
11bd0 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
11be0 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
11bf0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11c00 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
11c10 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
11c20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
11c30 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
11c40 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
11c50 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
11c60 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
11c70 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
11c80 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
11c90 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
11ca0 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
11cb0 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
11cc0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
11cd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11ce0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
11cf0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
11d00 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69  */.  rc = osMkdi
11d10 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37  r(zLockFile, 077
11d20 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  7);.  if( rc<0 )
11d30 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
11d40 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
11d50 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  he lock director
11d60 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72  y */.    int tEr
11d70 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
11d80 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74   if( EEXIST == t
11d90 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
11da0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
11db0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
11dc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
11dd0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
11de0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11df0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
11e00 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
11e10 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
11e20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11e30 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
11e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11e50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11e60 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  } .  .  /* got i
11e70 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
11e80 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
11e90 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
11ea0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11eb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11ec0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
11ed0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
11ee0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
11ef0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
11f00 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
11f10 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
11f20 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
11f30 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
11f40 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
11f50 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
11f60 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
11f70 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
11f80 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
11f90 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
11fa0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
11fb0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
11fc0 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
11fd0 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
11fe0 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
11ff0 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
12000 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
12010 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
12020 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12030 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
12040 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12050 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12060 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
12070 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
12080 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
12090 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  text;.  int rc;.
120a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
120b0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
120c0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
120d0 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
120e0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
120f0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
12100 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
12110 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
12120 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
12130 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
12140 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12150 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
12160 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
12170 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
12180 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
12190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
121a0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
121b0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
121c0 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
121d0 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
121e0 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
121f0 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
12200 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
12210 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
12220 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
12230 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
12240 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12250 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12260 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
12270 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12280 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
12290 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
122a0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
122b0 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
122c0 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
122d0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
122e0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
122f0 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
12300 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26  e);.  if( rc<0 &
12310 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52  & errno==ENOTDIR
12320 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b   ) rc = osUnlink
12330 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
12340 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
12350 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12360 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  o;.    rc = 0;. 
12370 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
12380 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
12390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
123a0 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RR_UNLOCK;.    }
123b0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
123c0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
123d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
123e0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
123f0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
12400 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
12410 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
12420 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
12430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12440 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
12450 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
12460 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
12470 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
12480 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
12490 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
124a0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
124b0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
124c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
124d0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
124e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
124f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
12500 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
12510 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
12520 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12530 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
12540 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  text);.    rc = 
12550 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
12560 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12570 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}./*********
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
12590 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
125a0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
125b0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
125c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
125d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
12690 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
126c0 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
126d0 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
126e0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
126f0 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
12700 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
12710 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
12720 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
12730 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
12740 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
12750 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
12760 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
12770 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
12780 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
12790 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
127a0 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
127b0 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
127c0 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
127d0 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
127e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
127f0 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
12800 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
12810 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
12820 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
12830 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
12840 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
12850 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
12860 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
12870 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
12880 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
12890 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
128a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
128b0 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20  E is turned off 
128c0 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69  or if.** compili
128d0 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a  ng for VXWORKS..
128e0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
128f0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12900 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
12910 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  S../*.** Retry f
12920 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61  lock() calls tha
12930 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54  t fail with EINT
12940 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54  R.*/.#ifdef EINT
12950 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  R.static int rob
12960 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64  ust_flock(int fd
12970 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74  , int op){.  int
12980 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
12990 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77  flock(fd,op); }w
129a0 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
129b0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
129c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
129d0 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75  se.# define robu
129e0 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c  st_flock(a,b) fl
129f0 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a  ock(a,b).#endif.
12a00 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69       ../*.** Thi
12a10 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
12a20 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
12a30 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
12a40 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
12a50 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
12a60 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
12a70 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
12a80 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
12a90 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
12aa0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
12ab0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
12ac0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
12ad0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
12ae0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
12af0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
12b00 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
12b10 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
12b20 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
12b30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12b40 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
12b50 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
12b60 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
12b70 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
12b80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12b90 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
12ba0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
12bb0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12bc0 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
12bd0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
12be0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
12bf0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
12c00 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
12c10 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
12c20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
12c30 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
12c40 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
12c50 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
12c60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12c70 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
12c80 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
12c90 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
12ca0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
12cb0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
12cc0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
12cd0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
12ce0 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
12cf0 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
12d00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
12d10 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
12d20 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
12d30 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
12d40 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
12d50 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
12d60 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
12d70 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62  .      lrc = rob
12d80 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
12d90 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
12da0 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
12db0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
12dc0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12dd0 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
12de0 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
12df0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
12e00 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
12e10 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20  R_UNLOCK; .     
12e20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12e30 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
12e40 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12e50 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12e60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
12e70 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   lrc;.        }.
12e80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
12e90 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  se {.      int t
12ea0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12eb0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
12ec0 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  1;.      /* some
12ed0 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
12ee0 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
12ef0 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73  */.      lrc = s
12f00 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
12f10 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
12f20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
12f30 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  CK); .      if( 
12f40 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12f50 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
12f60 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12f70 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
12f80 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
12f90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
12fa0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
12fb0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
12fc0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
12fd0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
12fe0 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
12ff0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
13000 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
13010 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
13020 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
13030 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
13040 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13050 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
13060 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13070 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13080 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13090 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
130a0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
130b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
130c0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
130d0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
130e0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
130f0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
13100 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
13110 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
13120 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
13130 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
13140 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
13150 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
13160 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
13170 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
13180 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
13190 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
131a0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
131b0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
131c0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
131d0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
131e0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
131f0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
13200 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
13210 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
13220 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
13230 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
13240 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
13250 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
13260 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
13270 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
13280 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
13290 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
132a0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
132b0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
132c0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
132d0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
132e0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
132f0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
13300 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
13310 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13320 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
13330 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
13340 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
13350 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
13360 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
13370 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
13380 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
13390 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
133a0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
133b0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
133c0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
133d0 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
133e0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
133f0 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
13400 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
13410 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
13420 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
13430 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
13440 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
13450 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
13460 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
13470 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
13480 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
13490 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
134a0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
134b0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
134c0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
134d0 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
134e0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
134f0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13500 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13510 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
13520 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13530 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
13540 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
13550 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
13560 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
13570 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
13580 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
13590 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
135a0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
135b0 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
135c0 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
135d0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
135e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
135f0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13600 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13610 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
13620 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13630 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
13640 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13650 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
13660 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
13670 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
13680 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
13690 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
136a0 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
136b0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
136c0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
136d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
136e0 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
136f0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
13700 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
13710 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
13720 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
13730 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74   {.    /* got it
13740 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
13750 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
13760 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13770 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
13780 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
13790 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
137a0 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %s (flock)\n", p
137b0 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
137c0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
137d0 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
137e0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
137f0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23   : "failed"));.#
13800 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
13810 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13820 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
13830 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
13840 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
13850 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13860 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
13870 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
13880 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13890 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
138a0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
138b0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
138c0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
138d0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
138e0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
138f0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
13900 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
13910 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
13920 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
13930 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13940 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13950 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13960 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13970 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13980 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
13990 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
139a0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
139b0 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
139c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
139d0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
139e0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
139f0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13a00 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
13a10 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
13a20 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
13a30 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
13a40 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
13a50 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
13a60 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
13a70 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13a80 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
13a90 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
13aa0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
13ab0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
13ac0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
13ad0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13ae0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
13af0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
13b00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13b10 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
13b20 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
13b30 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
13b40 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
13b50 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
13b60 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
13b70 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
13b80 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
13b90 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
13ba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13bb0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
13bc0 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
13bd0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f    if( robust_flo
13be0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
13bf0 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20  K_UN) ){.#ifdef 
13c00 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13c10 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
13c20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13c30 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  E_OK;.#endif /* 
13c40 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13c50 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
13c60 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
13c70 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13c80 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
13c90 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13ca0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
13cb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13cc0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
13cd0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
13ce0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13cf0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13d00 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
13d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13d20 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
13d30 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
13d40 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63  NO_LOCK);.    rc
13d50 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
13d60 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
13d70 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
13d80 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
13d90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
13da0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
13db0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13dc0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
13dd0 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
13de0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
13df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e00 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e50 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ea0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
13ec0 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
13ed0 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
13ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ef0 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
13f00 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
13f10 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
13f20 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
13f30 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
13f40 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
13f50 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
13f60 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
13f70 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
13f80 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
13f90 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
13fa0 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
13fb0 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
13fc0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
13fd0 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
13fe0 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
13ff0 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
14000 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
14010 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
14020 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
14030 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
14040 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
14050 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
14060 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
14070 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
14080 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
14090 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
140a0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
140b0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
140c0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
140d0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
140e0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
140f0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
14100 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
14110 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
14120 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
14130 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
14140 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
14150 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
14160 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
14170 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
14180 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65  int semCheckRese
14190 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
141a0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
141b0 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
141c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
141d0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
141e0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
141f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14200 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
14210 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
14220 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14230 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
14240 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
14250 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
14260 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
14270 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
14280 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
14290 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
142a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
142b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
142c0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
142d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
142e0 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
142f0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
14300 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
14310 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
14320 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  .    sem_t *pSem
14330 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
14340 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28  ->pSem;..    if(
14350 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
14360 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
14370 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
14380 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
14390 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
143a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
143b0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
143c0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
143d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
143e0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
143f0 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
14400 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
14410 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  rno;.      } els
14420 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
14430 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
14440 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
14450 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
14460 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
14470 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46  ved = (pFile->eF
14480 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44  ileLock < SHARED
14490 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
144a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
144b0 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76   /* we could hav
144c0 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
144d0 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f  it */.      sem_
144e0 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20  post(pSem);.    
144f0 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
14500 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
14510 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22  d %d %d (sem)\n"
14520 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
14530 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
14540 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
14550 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
14560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
14570 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
14580 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
14590 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
145a0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
145b0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
145c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
145d0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
145e0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
145f0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14600 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14610 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14620 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14630 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
14640 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
14650 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
14660 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
14670 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
14680 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
14690 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
146a0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
146b0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
146c0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
146d0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
146e0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
146f0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14700 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14710 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14720 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14730 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
14740 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
14750 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
14760 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
14770 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
14780 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
14790 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
147a0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
147b0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
147c0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
147d0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
147e0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
147f0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14800 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14810 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d  LUSIVE.**.** Sem
14820 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c  aphore locks onl
14830 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
14840 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
14850 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
14860 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
14870 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
14880 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
14890 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
148a0 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
148b0 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
148c0 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
148d0 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
148e0 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
148f0 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
14900 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
14910 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
14920 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
14930 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
14940 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
14950 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
14960 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
14970 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
14980 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28  tic int semLock(
14990 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
149a0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
149b0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
149c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
149d0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
149e0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
149f0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  ode->pSem;.  int
14a00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14a10 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
14a20 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
14a30 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
14a40 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
14a50 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
14a60 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
14a70 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
14a80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
14a90 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
14aa0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14ab0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
14ac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14ad0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
14ae0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
14af0 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
14b00 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
14b10 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
14b20 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
14b30 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
14b40 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
14b50 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
14b60 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
14b70 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
14b80 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
14b90 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
14ba0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
14bb0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14bc0 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e  leLock;.. sem_en
14bd0 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
14be0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
14bf0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
14c00 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
14c10 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
14c20 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
14c30 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
14c40 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
14c50 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
14c60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
14c70 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
14c80 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
14c90 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
14ca0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
14cb0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
14cc0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
14cd0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
14ce0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
14cf0 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69  t semUnlock(sqli
14d00 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14d10 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
14d20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14d30 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14d40 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
14d50 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
14d60 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >pSem;..  assert
14d70 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
14d80 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f  ert( pSem );.  O
14d90 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
14da0 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
14db0 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d=%d (sem)\n", p
14dc0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
14dd0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
14de0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
14df0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
14e00 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
14e10 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
14e20 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
14e30 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
14e40 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
14e50 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
14e60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14e70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
14e80 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
14e90 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
14ea0 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
14eb0 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
14ec0 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
14ed0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
14ee0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
14ef0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14f00 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
14f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14f20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
14f30 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
14f40 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
14f50 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
14f60 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
14f70 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
14f80 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14f90 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14fa0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
14fb0 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
14fc0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
14fd0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
14fe0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
14ff0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
15000 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
15010 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15020 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
15030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15040 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
15050 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
15060 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
15070 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
15080 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
15090 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
150a0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
150b0 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
150c0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
150d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
150e0 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
150f0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
15100 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
15110 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
15120 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15130 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
15140 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
15150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15160 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
15170 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
15180 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
15190 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
151a0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
151b0 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
151c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
151d0 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
151e0 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
151f0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
15200 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
15210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15250 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
15260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
152b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152c0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
152d0 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
152e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
15300 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
15310 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
15320 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
15330 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
15340 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
15350 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
15360 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
15370 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
15380 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
15390 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
153a0 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
153b0 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
153c0 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
153d0 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
153e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
153f0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
15400 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
15410 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
15420 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
15430 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
15440 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
15450 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
15460 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
15470 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
15480 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
15490 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
154a0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
154b0 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
154c0 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
154d0 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
154e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
154f0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
15500 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
15510 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
15520 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
15530 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
15540 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
15550 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
15560 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
15570 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
15580 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
15590 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
155a0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
155b0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
155c0 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
155d0 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
155e0 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
155f0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
15600 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
15610 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
15620 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
15630 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
15640 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
15650 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
15660 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
15670 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
15680 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156a0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
156b0 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
156c0 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
156d0 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
156e0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
156f0 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
15700 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
15710 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15720 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
15730 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
15740 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
15750 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
15760 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
15770 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
15780 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
15790 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
157a0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
157b0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
157c0 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
157d0 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
157e0 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
157f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15800 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
15810 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
15820 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
15830 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
15840 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
15850 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
15860 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
15870 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
15880 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
15890 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
158a0 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
158b0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
158c0 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
158d0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
158e0 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
158f0 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
15900 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15910 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
15920 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
15930 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
15940 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15950 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
15960 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
15970 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
15980 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
15990 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
159a0 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
159b0 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
159c0 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
159d0 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
159e0 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
159f0 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
15a00 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
15a10 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
15a20 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
15a30 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
15a40 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
15a50 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
15a60 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
15a70 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
15a80 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
15a90 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
15aa0 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
15ab0 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
15ac0 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
15ad0 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
15ae0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
15af0 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
15b00 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
15b10 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
15b20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
15b30 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
15b40 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
15b50 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
15b60 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
15b70 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
15b80 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15b90 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
15ba0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15bb0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15bc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15bd0 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
15be0 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
15bf0 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
15c00 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
15c10 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
15c20 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
15c30 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
15c40 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
15c50 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
15c60 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
15c70 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
15c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
15c90 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
15ca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
15cc0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
15cd0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
15ce0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
15cf0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
15d00 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
15d10 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
15d20 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
15d30 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
15d40 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
15d50 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
15d60 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
15d70 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
15d80 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
15d90 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
15da0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
15db0 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
15dc0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
15dd0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
15de0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
15df0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
15e00 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15e10 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
15e20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15e30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
15e40 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
15e50 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15e60 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15e70 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
15e80 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
15e90 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
15ea0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
15eb0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
15ec0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
15ed0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15ee0 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
15ef0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15f00 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15f10 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
15f20 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
15f30 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
15f40 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
15f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15f60 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
15f70 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
15f80 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
15f90 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
15fa0 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
15fb0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
15fc0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
15fd0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
15fe0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
15ff0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
16000 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
16010 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
16020 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
16030 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
16040 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
16050 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
16060 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
16070 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
16080 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
16090 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
160a0 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
160b0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
160c0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
160d0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
160e0 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
160f0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
16100 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
16110 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
16120 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
16130 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
16140 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
16150 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
16160 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
16170 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
16180 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16190 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
161a0 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
161b0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
161c0 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
161d0 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
161e0 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
161f0 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
16200 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
16210 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
16220 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
16230 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
16240 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
16250 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
16260 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
16270 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
16280 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
16290 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
162a0 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
162b0 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
162c0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
162d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
162e0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
162f0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
16300 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
16310 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
16320 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
16330 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
16340 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
16350 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
16360 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
16370 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
16380 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
16390 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
163a0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
163b0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
163c0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
163d0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
163e0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
163f0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
16400 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
16410 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
16420 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
16430 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
16440 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
16450 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
16460 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
16470 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
16480 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
16490 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
164a0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
164b0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
164c0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
164d0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
164e0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
164f0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
16500 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
16510 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
16520 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
16530 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16540 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16550 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
16560 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16570 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
16580 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
16590 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
165a0 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
165b0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
165c0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
165d0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
165e0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
165f0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
16600 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
16610 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16620 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
16630 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
16640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
16650 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
16660 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
16670 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
16680 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
16690 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
166a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
166b0 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
166c0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
166d0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
166e0 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
166f0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
16700 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16710 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
16720 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
16730 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
16740 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
16750 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
16760 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
16770 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
16780 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
16790 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
167a0 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
167b0 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
167c0 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
167d0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
167e0 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
167f0 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
16800 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
16810 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
16820 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
16830 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
16840 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
16850 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
16860 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
16870 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
16880 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
16890 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
168a0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
168b0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
168c0 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
168d0 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e  dy held) (afp)\n
168e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
168f0 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
16900 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
16910 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16920 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
16930 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
16940 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
16950 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  is correct.  ** 
16960 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
16970 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
16980 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
16990 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
169a0 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
169b0 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
169c0 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
169d0 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
169e0 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
169f0 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
16a00 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
16a10 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
16a20 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
16a30 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
16a40 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
16a50 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
16a60 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16a70 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16a80 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
16a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
16aa0 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
16ab0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
16ac0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
16ad0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
16ae0 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
16af0 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
16b00 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
16b10 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
16b20 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
16b30 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
16b40 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
16b50 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
16b60 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
16b70 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
16b80 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
16b90 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
16ba0 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
16bb0 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
16bc0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
16bd0 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
16be0 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
16bf0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
16c00 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
16c10 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64  & .       (pInod
16c20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
16c30 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
16c40 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
16c50 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20  OCK)).     ){.  
16c60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
16c70 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  SY;.    goto afp
16c80 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
16c90 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52   .  /* If a SHAR
16ca0 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
16cb0 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
16cc0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
16cd0 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
16ce0 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
16cf0 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
16d00 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
16d10 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
16d20 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
16d30 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
16d40 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
16d50 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
16d60 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e   .     (pInode->
16d70 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16d80 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
16d90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
16da0 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
16db0 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
16dc0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16dd0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
16de0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16df0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
16e00 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
16e10 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
16e20 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16e30 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16e40 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16e50 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
16e60 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
16e70 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16e80 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
16e90 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
16ea0 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
16eb0 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
16ec0 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
16ed0 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
16ee0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16ef0 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
16f00 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
16f10 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
16f20 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
16f30 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
16f40 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
16f50 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
16f60 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
16f70 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
16f80 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
16f90 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
16fa0 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
16fb0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
16fc0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16fd0 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
16fe0 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
16ff0 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
17000 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
17010 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
17020 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
17030 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
17040 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
17050 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
17060 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
17070 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
17080 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
17090 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
170a0 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
170b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
170c0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
170d0 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
170e0 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45  rc1, lrc2, lrc1E
170f0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  rrno = 0;.    lo
17100 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20  ng lk, mask;.   
17110 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49   .    assert( pI
17120 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
17130 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17140 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17150 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
17160 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a  .    mask = (siz
17170 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20  eof(long)==8) ? 
17180 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20  LARGEST_INT64 : 
17190 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0x7fffffff;.    
171a0 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
171b0 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f  ead-lock SHARED_
171c0 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  LOCK */.    /* n
171d0 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
171e0 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
171f0 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
17200 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
17210 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
17220 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64  om(); .    pInod
17230 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  e->sharedByte = 
17240 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
17250 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
17260 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
17270 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17280 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
17290 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
172a0 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
172b0 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  redByte, 1, 1);.
172c0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
172d0 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20  ERROR(lrc1) ){. 
172e0 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d       lrc1Errno =
172f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17300 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  o;.    }.    /* 
17310 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
17320 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
17330 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66  */.    lrc2 = af
17340 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17350 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17360 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
17370 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  , 0);.    .    i
17380 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
17390 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20  (lrc1) ) {.     
173a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
173b0 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  o = lrc1Errno;. 
173c0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
173d0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
173e0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
173f0 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
17400 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
17410 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
17420 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
17430 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
17440 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
17450 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
17460 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
17470 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
17480 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17490 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
174a0 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
174b0 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
174c0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
174d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
174e0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
174f0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
17500 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
17510 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
17520 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
17530 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
17540 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
17550 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
17560 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
17570 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
17580 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
17590 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
175a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
175b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
175c0 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
175d0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
175e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
175f0 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
17600 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
17610 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
17620 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
17630 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
17640 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
17650 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
17660 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
17670 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
17680 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
17690 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
176a0 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
176b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
176c0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
176d0 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
176e0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
176f0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
17700 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
17710 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17720 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
17730 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
17740 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
17750 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
17760 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
17770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17780 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
17790 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
177a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
177b0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
177c0 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
177d0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
177e0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
177f0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17800 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
17810 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
17820 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
17830 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
17840 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
17850 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
17860 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
17870 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
17880 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
17890 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
178a0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
178b0 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
178e0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
178f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
17900 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
17910 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
17920 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
17930 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
17940 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
17950 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
17960 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17970 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17980 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
17990 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
179c0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
179d0 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
179e0 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
179f0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17a00 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
17a30 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17a40 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
17a50 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
17a60 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
17a70 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
17a80 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
17a90 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
17aa0 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
17ab0 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
17ac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17ad0 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
17ae0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
17af0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
17b00 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17b20 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
17b30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
17b40 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
17b50 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
17b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
17b70 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
17b80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17b90 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
17ba0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
17bb0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
17bc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17bd0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
17be0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
17bf0 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
17c00 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
17c10 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
17c20 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
17c30 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
17c40 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
17c50 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
17c60 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
17c70 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
17c80 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
17c90 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
17ca0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
17cb0 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
17cc0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
17cd0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
17ce0 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
17cf0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
17d00 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
17d10 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
17d20 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
17d30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
17d40 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
17d50 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
17d60 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
17d70 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
17d80 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
17d90 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
17da0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
17db0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
17dc0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
17dd0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
17de0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
17df0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
17e00 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
17e10 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
17e20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
17e30 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
17e40 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
17e50 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
17e60 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
17e70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17e80 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
17e90 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17ea0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
17eb0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
17ec0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
17ed0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
17ee0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
17ef0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
17f00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
17f10 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
17f20 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
17f30 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
17f40 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
17f50 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
17f60 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
17f70 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
17f80 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
17f90 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
17fa0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
17fb0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
17fc0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
17fd0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17fe0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
17ff0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
18000 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  d,.           ge
18010 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
18020 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
18030 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18040 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18050 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
18060 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18070 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18080 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
18090 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
180a0 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
180b0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
180c0 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
180d0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
180e0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
180f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
18100 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
18110 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
18120 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
18130 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
18140 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
18150 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
18160 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18170 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18180 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
18190 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
181a0 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
181b0 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
181c0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
181d0 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
181e0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
181f0 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
18200 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
18210 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
18220 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
18230 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
18240 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
18250 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
18260 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
18270 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18280 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
18290 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
182a0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
182b0 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
182c0 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
182d0 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
182e0 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
182f0 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
18300 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
18310 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
18320 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
18330 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
18340 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
18350 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
18360 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
18370 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
18380 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
18390 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
183a0 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
183b0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
183c0 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
183d0 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
183e0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
183f0 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
18400 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
18410 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
18420 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
18430 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18440 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18450 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
18460 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
18470 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
18480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18490 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
184a0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
184b0 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
184c0 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
184d0 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
184e0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
184f0 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
18500 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
18510 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
18520 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
18530 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18540 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
18550 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18560 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18570 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
18580 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
18590 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
185a0 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
185b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
185c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
185d0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
185e0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
185f0 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
18600 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18610 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18620 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
18630 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
18640 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
18650 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
18660 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
18670 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
18680 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
18690 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
186a0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
186b0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
186c0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
186d0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
186e0 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
186f0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
18700 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
18710 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18730 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
18740 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
18750 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
18760 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
18770 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
18780 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
18790 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
187a0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
187b0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
187c0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
187d0 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
187e0 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
187f0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
18800 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
18810 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
18820 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
18830 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
18840 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
18850 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
18860 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
18870 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
18880 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
18890 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
188a0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
188b0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
188c0 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
188d0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
188e0 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
188f0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18900 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
18910 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
18920 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
18930 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18940 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
18950 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
18960 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18970 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18980 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
18990 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
189a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
189b0 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
189c0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
189d0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
189e0 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
189f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
18a00 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
18a10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18a30 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
18a40 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
18a50 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
18a60 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
18a70 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
18a80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
18a90 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
18aa0 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
18ab0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
18ac0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
18ad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18ae0 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
18af0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
18b00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18b10 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
18b20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
18b30 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
18b40 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
18b50 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c  static int afpCl
18b60 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
18b70 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
18b80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18b90 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
18ba0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
18bb0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
18bc0 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c     afpUnlock(id,
18bd0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
18be0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
18bf0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
18c00 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d  pInode && pFile-
18c10 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
18c20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
18c30 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
18c40 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
18c50 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
18c60 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
18c70 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
18c80 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
18c90 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
18ca0 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
18cb0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
18cc0 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
18cd0 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67  pInode->aPending
18ce0 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
18cf0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
18d00 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
18d10 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
18d20 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
18d30 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
18d40 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
18d50 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
18d60 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
18d70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
18d80 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
18d90 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
18da0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
18db0 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
18dc0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
18dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18de0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
18df0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
18e00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
18e10 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
18e20 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
18e30 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
18e40 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
18e50 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
18e60 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
18e70 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
18e80 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
18e90 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
18ea0 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
18eb0 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
18ec0 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
18ed0 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
18ee0 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
18ef0 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
18f00 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
18f10 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
18f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
18f30 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
18f40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
18f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f60 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
18f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fb0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
18fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19000 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
19010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19020 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
19030 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
19040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19050 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
19060 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
19070 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
19080 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
19090 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
190a0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
190b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
190c0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
190d0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
190e0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
190f0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
19100 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
19110 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
19120 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
19130 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
19140 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
19150 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
19160 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
19170 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
19180 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
19190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
191a0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
191b0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
191c0 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
191d0 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
191e0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
191f0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
19200 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
19210 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
19220 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
19230 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
19240 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
19250 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
19260 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
19270 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
19280 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
19290 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
192a0 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
192b0 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
192c0 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
192d0 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
192e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192f0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
19300 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
19310 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
19320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
19330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
19380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
193d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
193e0 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
193f0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
19420 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
19430 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
19440 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
19450 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
19460 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
19470 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
19480 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
19490 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
194a0 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
194b0 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
194c0 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
194d0 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
194e0 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
194f0 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
19500 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
19510 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
19520 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
19530 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
19540 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
19550 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
19560 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
19570 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
19580 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19590 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
195a0 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
195b0 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
195c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
195d0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
195e0 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
195f0 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
19600 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
19610 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
19620 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
19630 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
19640 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
19650 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
19660 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
19670 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
19680 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
19690 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
196a0 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
196b0 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62  ** in any form b
196c0 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
196d0 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
196e0 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
196f0 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
19700 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
19710 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
19720 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
19730 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
19740 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
19750 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
19760 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
19770 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
19780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
19790 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
197a0 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
197b0 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
197c0 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
197d0 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
197e0 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b    int prior = 0;
197f0 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
19800 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
19810 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
19820 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
19830 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
19840 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73  MER_START;.  ass
19850 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
19860 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
19870 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a  ert( id->h>2 );.
19880 20 20 63 6e 74 20 26 3d 20 30 78 31 66 66 66 66    cnt &= 0x1ffff
19890 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69  ;.  do{.#if defi
198a0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
198b0 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
198c0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
198d0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
198e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
198f0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19900 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19910 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20  READ64).    got 
19920 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e  = osPread64(id->
19930 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
19940 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
19950 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
19960 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
19970 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
19980 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
19990 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
199a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
199b0 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
199c0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
199d0 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
199e0 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
199f0 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
19a00 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19a10 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19a20 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
19a30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
19a40 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
19a50 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  stErrno = 0;.   
19a60 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
19a70 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
19a80 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
19a90 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
19aa0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
19ab0 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
19ac0 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
19ad0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
19ae0 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
19af0 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
19b00 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
19b10 3b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  ;.      ((unixFi
19b20 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
19b30 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
19b40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
19b50 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a  se if( got>0 ){.
19b60 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74        cnt -= got
19b70 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
19b80 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69  = got;.      pri
19b90 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  or += got;.     
19ba0 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28   pBuf = (void*)(
19bb0 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75  got + (char*)pBu
19bc0 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  f);.    }.  }whi
19bd0 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54  le( got>0 );.  T
19be0 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
19bf0 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d  ACE(("READ    %-
19c00 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
19c10 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  u\n",.          
19c20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69    id->h, got+pri
19c30 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72  or, offset-prior
19c40 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
19c50 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b  );.  return got+
19c60 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  prior;.}../*.** 
19c70 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
19c80 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
19c90 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
19ca0 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
19cb0 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
19cc0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
19cd0 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
19ce0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
19cf0 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
19d00 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
19d10 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
19d20 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
19d30 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
19d40 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
19d50 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
19d60 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
19d70 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
19d80 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
19d90 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
19da0 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
19db0 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
19dc0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
19dd0 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
19de0 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
19df0 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
19e00 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
19e10 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
19e20 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
19e30 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
19e40 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
19e50 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
19e60 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
19e70 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
19e80 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
19e90 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
19ea0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
19eb0 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
19ec0 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
19ed0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
19ee0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
19ef0 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
19f00 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
19f10 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
19f20 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
19f30 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
19f40 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
19f50 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
19f60 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
19f70 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
19f80 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
19f90 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
19fa0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
19fb0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
19fc0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
19fd0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
19fe0 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
19ff0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a000 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1a010 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1a020 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1a030 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1a040 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1a050 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1a060 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1a070 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
1a080 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1a090 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1a0a0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1a0b0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1a0c0 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1a0d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1a0e0 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
1a0f0 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
1a100 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
1a110 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
1a120 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1a130 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
1a140 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1a150 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1a160 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
1a170 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1a180 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1a190 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a1a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1a1b0 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
1a1c0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1a1d0 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
1a1e0 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
1a1f0 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
1a200 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
1a210 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
1a220 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
1a230 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
1a240 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1a250 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
1a260 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1a270 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65  seek the file-de
1a280 73 63 72 69 70 74 6f 72 20 70 61 73 73 65 64 20  scriptor passed 
1a290 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1a2a0 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f  ument to.** abso
1a2b0 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66  lute offset iOff
1a2c0 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74  , then attempt t
1a2d0 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62 79 74  o write nBuf byt
1a2e0 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a  es of data from.
1a2f0 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49  ** pBuf to it. I
1a300 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a310 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64  s, return -1 and
1a320 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f   set *piErrno. O
1a330 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65  therwise, .** re
1a340 74 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20  turn the actual 
1a350 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a360 77 72 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d  written (which m
1a370 61 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a  ay be less than.
1a380 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61  ** nBuf)..*/.sta
1a390 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1a3a0 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64  riteFd(.  int fd
1a3b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a3d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1a3e0 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36  write to */.  i6
1a3f0 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20  4 iOff,         
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a410 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20   File offset to 
1a420 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
1a430 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1a440 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
1a450 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61        /* Copy da
1a460 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66  ta from this buf
1a470 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20  fer to the file 
1a480 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20  */.  int nBuf,  
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a4b0 62 75 66 66 65 72 20 70 42 75 66 20 69 6e 20 62  buffer pBuf in b
1a4c0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
1a4d0 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20  iErrno          
1a4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a4f0 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69  : Error number i
1a500 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  f error occurs *
1a510 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1a520 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a530 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1a540 72 65 74 75 72 6e 65 64 20 62 79 20 73 79 73 74  returned by syst
1a550 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73  em call */..  as
1a560 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75  sert( nBuf==(nBu
1a570 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  f&0x1ffff) );.  
1a580 61 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a  assert( fd>2 );.
1a590 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66    nBuf &= 0x1fff
1a5a0 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  f;.  TIMER_START
1a5b0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  ;..#if defined(U
1a5c0 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20  SE_PREAD).  do{ 
1a5d0 72 63 20 3d 20 6f 73 50 77 72 69 74 65 28 66 64  rc = osPwrite(fd
1a5e0 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1a5f0 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  ff); }while( rc<
1a600 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1a610 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  R );.#elif defin
1a620 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
1a630 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72    do{ rc = osPwr
1a640 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20  ite64(fd, pBuf, 
1a650 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69  nBuf, iOff);}whi
1a660 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1a670 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
1a680 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69  .  do{.    i64 i
1a690 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c  Seek = lseek(fd,
1a6a0 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29   iOff, SEEK_SET)
1a6b0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1a6c0 45 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d 20 29  Error( iSeek-- )
1a6d0 3b 0a 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b  ;..    if( iSeek
1a6e0 21 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  !=iOff ){.      
1a6f0 69 66 28 20 70 69 45 72 72 6e 6f 20 29 20 2a 70  if( piErrno ) *p
1a700 69 45 72 72 6e 6f 20 3d 20 28 69 53 65 65 6b 3d  iErrno = (iSeek=
1a710 3d 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20 30 29  =-1 ? errno : 0)
1a720 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
1a730 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
1a740 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42  = osWrite(fd, pB
1a750 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68  uf, nBuf);.  }wh
1a760 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1a770 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
1a780 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44  dif..  TIMER_END
1a790 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ;.  OSTRACE(("WR
1a7a0 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
1a7b0 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64  7lld %llu\n", fd
1a7c0 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45  , rc, iOff, TIME
1a7d0 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20  R_ELAPSED));..  
1a7e0 69 66 28 20 72 63 3c 30 20 26 26 20 70 69 45 72  if( rc<0 && piEr
1a7f0 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d  rno ) *piErrno =
1a800 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e   errno;.  return
1a810 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
1a820 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
1a830 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20  t in id->offset 
1a840 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79  then read cnt by
1a850 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a  tes into pBuf..*
1a860 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1a870 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1a880 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64  ually read.  Upd
1a890 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a  ate the offset..
1a8a0 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1a8b0 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1a8c0 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1a8d0 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61  led write the la
1a8e0 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
1a8f0 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
1a900 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1a910 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1a920 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69  rite(unixFile *i
1a930 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63  d, i64 offset, c
1a940 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1a950 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74   int cnt){.  ret
1a960 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65  urn seekAndWrite
1a970 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  Fd(id->h, offset
1a980 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64  , pBuf, cnt, &id
1a990 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a  ->lastErrno);.}.
1a9a0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
1a9b0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1a9c0 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
1a9d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1a9e0 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
1a9f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1aa00 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
1aa10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1aa20 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
1aa30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1aa40 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1aa50 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
1aa60 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1aa70 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
1aa80 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1aa90 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1aaa0 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
1aab0 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1aac0 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
1aad0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1aae0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
1aaf0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
1ab00 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
1ab10 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
1ab20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
1ab30 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1ab40 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
1ab50 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
1ab60 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
1ab70 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1ab80 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
1ab90 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1aba0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1abb0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1abc0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1abd0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1abe0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1abf0 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
1ac00 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1ac10 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1ac20 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1ac30 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
1ac40 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1ac50 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1ac60 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1ac70 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1ac80 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
1ac90 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
1aca0 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
1acb0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1acc0 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
1acd0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
1ace0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1acf0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
1ad00 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
1ad10 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
1ad20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1ad30 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
1ad40 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
1ad50 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
1ad60 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
1ad70 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
1ad80 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
1ad90 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
1ada0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1adb0 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
1adc0 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
1add0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1ade0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
1adf0 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
1ae00 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
1ae10 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
1ae20 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1ae30 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
1ae40 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
1ae50 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
1ae60 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
1ae70 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
1ae80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1ae90 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
1aea0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1aeb0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
1aec0 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
1aed0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1aee0 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
1aef0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1af00 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
1af10 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77  s much of this w
1af20 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20  rite request as 
1af30 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
1af40 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
1af50 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
1af60 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
1af70 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
1af80 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
1af90 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1afa0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1afb0 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
1afc0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
1afd0 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1afe0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1aff0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1b000 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
1b010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1b030 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
1b040 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
1b050 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
1b060 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
1b070 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1b080 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43  ffset], pBuf, nC
1b090 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
1b0a0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
1b0b0 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
1b0c0 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
1b0d0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1b0e0 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
1b0f0 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61  ndif..  while( a
1b100 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
1b110 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
1b120 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
1b130 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
1b140 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
1b150 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
1b160 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1b170 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1b180 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
1b190 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
1b1a0 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
1b1b0 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
1b1c0 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
1b1d0 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
1b1e0 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  ;..  if( amt>0 )
1b1f0 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
1b200 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
1b210 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
1b220 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
1b230 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1b240 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
1b250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b260 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1b270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1b280 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1b290 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
1b2a0 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1b2b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b2c0 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
1b2d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b2e0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1b2f0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1b300 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1b310 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
1b320 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
1b330 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1b340 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
1b350 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
1b360 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
1b370 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
1b380 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
1b390 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
1b3a0 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
1b3b0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
1b3c0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1b3d0 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
1b3e0 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
1b3f0 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
1b400 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
1b410 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
1b420 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
1b430 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
1b440 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67  k with the (slig
1b450 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20  htly slower).** 
1b460 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20  fsync(). If you 
1b470 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
1b480 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
1b490 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
1b4a0 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
1b4b0 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
1b4c0 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
1b4d0 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23  c=fdatasync.*/.#
1b4e0 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74  if !defined(fdat
1b4f0 61 73 79 6e 63 29 0a 23 20 64 65 66 69 6e 65 20  async).# define 
1b500 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1b510 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1b520 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1b530 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1b540 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1b550 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1b560 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1b570 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1b580 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1b590 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1b5a0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1b5b0 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1b5c0 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1b5d0 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1b5e0 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1b5f0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1b600 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1b610 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1b620 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1b630 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
1b640 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
1b650 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
1b660 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
1b670 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
1b680 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
1b690 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
1b6a0 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
1b6b0 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
1b6c0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
1b6d0 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
1b6e0 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
1b6f0 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
1b700 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
1b710 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
1b720 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
1b730 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
1b740 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
1b750 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
1b760 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
1b770 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
1b780 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
1b790 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
1b7a0 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
1b7b0 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
1b7c0 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
1b7d0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
1b7e0 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
1b7f0 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
1b800 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
1b810 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
1b820 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
1b830 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1b840 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
1b850 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
1b860 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
1b870 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
1b880 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
1b890 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
1b8a0 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
1b8b0 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
1b8c0 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
1b8d0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
1b8e0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
1b8f0 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
1b900 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1b910 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
1b920 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
1b930 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
1b940 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
1b950 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
1b960 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
1b970 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
1b980 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
1b990 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
1b9a0 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
1b9b0 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
1b9c0 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
1b9d0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1b9e0 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
1b9f0 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
1ba00 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
1ba10 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
1ba20 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
1ba30 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
1ba40 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
1ba50 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
1ba60 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
1ba70 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
1ba80 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
1ba90 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
1baa0 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
1bab0 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
1bac0 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
1bad0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
1bae0 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
1baf0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
1bb00 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
1bb10 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1bb20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
1bb30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
1bb40 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
1bb50 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
1bb60 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
1bb70 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
1bb80 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
1bb90 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
1bba0 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
1bbb0 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
1bbc0 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
1bbd0 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
1bbe0 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
1bbf0 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
1bc00 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
1bc10 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
1bc20 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
1bc30 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
1bc40 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1bc50 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
1bc60 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1bc70 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1bc80 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1bc90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1bca0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1bcb0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1bcc0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1bcd0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1bce0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
1bcf0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1bd00 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1bd10 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1bd20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
1bd30 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
1bd40 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
1bd50 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
1bd60 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
1bd70 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
1bd80 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
1bd90 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
1bda0 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
1bdb0 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
1bdc0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
1bdd0 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
1bde0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1bdf0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
1be00 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
1be10 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1be20 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
1be30 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
1be40 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
1be50 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
1be60 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1be70 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
1be80 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
1be90 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
1bea0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1beb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bec0 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
1bed0 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
1bee0 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
1bef0 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46   osFcntl(fd, F_F
1bf00 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20  ULLFSYNC, 0);.  
1bf10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1bf20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74  1;.  }.  /* If t
1bf30 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69  he FULLFSYNC fai
1bf40 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  led, fall back t
1bf50 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20  o attempting an 
1bf60 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74  fsync()..  ** It
1bf70 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f   shouldn't be po
1bf80 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66  ssible for fullf
1bf90 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20  sync to fail on 
1bfa0 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20  the local .  ** 
1bfb0 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20  file system (on 
1bfc0 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65  OSX), so failure
1bfd0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1bfe0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69  FULLFSYNC.  ** i
1bff0 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66  sn't supported f
1c000 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73  or this file sys
1c010 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74  tem. So, attempt
1c020 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20   an fsync .  ** 
1c030 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67  and (for now) ig
1c040 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61  nore the overhea
1c050 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f  d of a superfluo
1c060 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20  us fcntl call.  
1c070 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65  .  ** It'd be be
1c080 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66  tter to detect f
1c090 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74  ullfsync support
1c0a0 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20   once and avoid 
1c0b0 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20  .  ** the fcntl 
1c0c0 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20  call every time 
1c0d0 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a  sync is called..
1c0e0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20    */.  if( rc ) 
1c0f0 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1c100 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
1c110 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66  _APPLE__).  /* f
1c120 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46  datasync() on HF
1c130 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66  S+ doesn't yet f
1c140 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69  lush the file si
1c150 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64  ze if it changed
1c160 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1c170 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20  so currently we 
1c180 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d  default to the m
1c190 61 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69  acro that redefi
1c1a0 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f  nes fdatasync to
1c1b0 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63   fsync.  */.  rc
1c1c0 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65   = fsync(fd);.#e
1c1d0 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74  lse .  rc = fdat
1c1e0 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f  async(fd);.#if O
1c1f0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
1c200 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d  rc==-1 && errno=
1c210 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20  =ENOTSUP ){.    
1c220 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1c230 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53    }.#endif /* OS
1c240 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64  _VXWORKS */.#end
1c250 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49  if /* ifdef SQLI
1c260 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20  TE_NO_SYNC elif 
1c270 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a  HAVE_FULLFSYNC *
1c280 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f  /..  if( OS_VXWO
1c290 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29  RKS && rc!= -1 )
1c2a0 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
1c2b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c2c0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
1c2d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1c2e0 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
1c2f0 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20  containing file 
1c300 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66  zFilename..** If
1c310 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46   successful, *pF
1c320 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
1c330 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63  opened file desc
1c340 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51  riptor and.** SQ
1c350 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1c360 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
1c370 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20   occurs, either 
1c380 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
1c390 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or SQLITE_CANTOP
1c3a0 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EN is returned a
1c3b0 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  nd *pFd is set t
1c3c0 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a  o an undefined.*
1c3d0 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  * value..**.** T
1c3e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
1c3f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1c400 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e  used for only on
1c410 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20  e thing - to.** 
1c420 66 73 79 6e 63 28 29 20 61 20 64 69 72 65 63 74  fsync() a direct
1c430 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ory to make sure
1c440 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61   file creation a
1c450 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e  nd deletion even
1c460 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65  ts.** are flushe
1c470 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68  d to disk.  Such
1c480 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20   fsyncs are not 
1c490 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a  needed on newer.
1c4a0 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69  ** journaling fi
1c4b0 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61  lesystems, but a
1c4c0 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f  re required on o
1c4d0 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73  lder filesystems
1c4e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c4f0 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72  tine can be over
1c500 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65  ridden using the
1c510 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74   xSetSysCall int
1c520 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61  erface..** The a
1c530 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69  bility to overri
1c540 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  de this routine 
1c550 77 61 73 20 61 64 64 65 64 20 69 6e 20 73 75 70  was added in sup
1c560 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63  port of the.** c
1c570 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e  hromium sandbox.
1c580 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65    Opening a dire
1c590 63 74 6f 72 79 20 69 73 20 61 20 73 65 63 75 72  ctory is a secur
1c5a0 69 74 79 20 72 69 73 6b 20 28 77 65 20 61 72 65  ity risk (we are
1c5b0 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b  .** told) so mak
1c5c0 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65 61  ing it overridea
1c5d0 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ble allows the c
1c5e0 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20  hromium sandbox 
1c5f0 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68  to.** replace th
1c600 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
1c610 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
1c620 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20  .  To make this 
1c630 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d  routine.** a no-
1c640 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77  op, replace it w
1c650 69 74 68 20 61 20 73 74 75 62 20 74 68 61 74 20  ith a stub that 
1c660 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1c670 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20  K but leaves.** 
1c680 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65  *pFd set to a ne
1c690 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a  gative number..*
1c6a0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1c6b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1c6c0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
1c6d0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f  ponsible for clo
1c6e0 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65  sing.** the file
1c6f0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64   descriptor *pFd
1c700 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a   using close()..
1c710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
1c720 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  enDirectory(cons
1c730 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1c740 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20  e, int *pFd){.  
1c750 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64  int ii;.  int fd
1c760 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44   = -1;.  char zD
1c770 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  irname[MAX_PATHN
1c780 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74  AME+1];..  sqlit
1c790 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
1c7a0 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61  PATHNAME, zDirna
1c7b0 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e  me, "%s", zFilen
1c7c0 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28  ame);.  for(ii=(
1c7d0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e  int)strlen(zDirn
1c7e0 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44  ame); ii>1 && zD
1c7f0 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b  irname[ii]!='/';
1c800 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69   ii--);.  if( ii
1c810 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61  >0 ){.    zDirna
1c820 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  me[ii] = '\0';. 
1c830 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
1c840 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
1c850 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
1c860 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
1c870 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  =0 ){.      OSTR
1c880 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d  ACE(("OPENDIR %-
1c890 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44  3d %s\n", fd, zD
1c8a0 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  irname));.    }.
1c8b0 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
1c8c0 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30  .  return (fd>=0
1c8d0 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c  ?SQLITE_OK:unixL
1c8e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1c8f0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1c900 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29  pen", zDirname))
1c910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1c920 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
1c930 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
1c940 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
1c950 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1c960 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
1c970 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
1c980 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
1c990 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
1c9a0 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
1c9b0 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
1c9c0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
1c9d0 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
1c9e0 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
1c9f0 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
1ca00 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
1ca10 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
1ca20 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
1ca30 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1ca40 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
1ca50 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
1ca60 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
1ca70 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
1ca80 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
1ca90 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
1caa0 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
1cab0 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
1cac0 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
1cad0 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
1cae0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
1caf0 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
1cb00 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
1cb10 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
1cb20 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
1cb30 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
1cb40 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
1cb50 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
1cb60 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
1cb70 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1cb80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1cb90 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
1cba0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1cbb0 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
1cbc0 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
1cbd0 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
1cbe0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1cbf0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1cc00 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
1cc10 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1cc20 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
1cc30 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
1cc40 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1cc50 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
1cc60 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
1cc70 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
1cc80 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
1cc90 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
1cca0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1ccb0 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
1ccc0 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
1ccd0 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
1cce0 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
1ccf0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
1cd00 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
1cd10 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
1cd20 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
1cd30 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1cd40 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
1cd50 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
1cd60 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
1cd70 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
1cd80 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
1cd90 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
1cda0 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
1cdb0 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
1cdc0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1cdd0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
1cde0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
1cdf0 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
1ce00 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
1ce10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1ce20 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1ce30 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
1ce40 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1ce50 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
1ce60 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
1ce70 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
1ce80 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
1ce90 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1cea0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
1ceb0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1cec0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1ced0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1cee0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
1cef0 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63  YNC, "full_fsync
1cf00 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1cf10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ;.  }..  /* Also
1cf20 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63   fsync the direc
1cf30 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1cf40 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20  the file if the 
1cf50 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a  DIRSYNC flag.  *
1cf60 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20  * is set.  This 
1cf70 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63  is a one-time oc
1cf80 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20  currence.  Many 
1cf90 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65  systems (example
1cfa0 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65  s: AIX).  ** are
1cfb0 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63   unable to fsync
1cfc0 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f   a directory, so
1cfd0 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f   ignore errors o
1cfe0 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a  n the fsync..  *
1cff0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
1d000 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1d010 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20  ILE_DIRSYNC ){. 
1d020 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20     int dirfd;.  
1d030 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
1d040 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c  YNC %s (have_ful
1d050 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
1d060 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
1d070 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ->zPath,.       
1d080 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
1d090 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
1d0a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  );.    rc = osOp
1d0b0 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c  enDirectory(pFil
1d0c0 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64  e->zPath, &dirfd
1d0d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d0e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66  QLITE_OK && dirf
1d0f0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75  d>=0 ){.      fu
1d100 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20  ll_fsync(dirfd, 
1d110 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62  0, 0);.      rob
1d120 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
1d130 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
1d140 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1d150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1d160 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
1d170 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d180 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1d190 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1d1a0 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
1d1b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d1c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1d1d0 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1d1e0 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1d1f0 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1d200 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1d210 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1d220 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1d230 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1d240 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1d250 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1d260 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1d270 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1d280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d290 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1d2a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1d2b0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1d2c0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1d2d0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1d2e0 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1d2f0 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1d300 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1d310 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1d320 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1d330 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1d340 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1d350 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1d360 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1d370 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1d380 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1d390 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1d3a0 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
1d3b0 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
1d3c0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
1d3d0 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
1d3e0 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1d3f0 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  k;.  }..  rc = r
1d400 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1d410 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
1d420 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1d430 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1d440 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1d450 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1d460 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1d470 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1d480 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1d490 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
1d4a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1d4b0 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1d4c0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1d4d0 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1d4e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1d4f0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1d500 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1d510 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1d520 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1d530 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1d540 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1d550 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1d560 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1d570 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1d580 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1d590 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1d5a0 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1d5b0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1d5c0 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1d5d0 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1d5e0 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1d5f0 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1d600 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1d610 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1d620 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1d630 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1d640 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1d650 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1d660 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1d670 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1d680 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
1d690 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1d6a0 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20  IZE>0.    /* If 
1d6b0 74 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73  the file was jus
1d6c0 74 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61  t truncated to a
1d6d0 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68   size smaller th
1d6e0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  an the currently
1d6f0 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  .    ** mapped r
1d700 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
1d710 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
1d720 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
1d730 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
1d740 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
1d750 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
1d760 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
1d770 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
1d780 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20  m now on.  .    
1d790 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  */.    if( nByte
1d7a0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1d7b0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1d7c0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
1d7d0 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  e;.    }.#endif.
1d7e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d7f0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
1d800 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
1d810 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1d820 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
1d830 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1d840 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
1d850 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1d860 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
1d870 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
1d880 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
1d890 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
1d8a0 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69  osFstat(((unixFi
1d8b0 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
1d8c0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1d8d0 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1d8e0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1d8f0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1d900 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1d910 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1d920 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1d930 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1d940 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1d950 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1d960 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1d970 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1d980 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f  dInodeInfo() pro
1d990 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74  cedure.  ** writ
1d9a0 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  es a single byte
1d9b0 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20   into that file 
1d9c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
1d9d0 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20   around a bug.  
1d9e0 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d  ** in the OS-X m
1d9f0 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e  sdos filesystem.
1da00 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76    In order to av
1da10 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  oid problems wit
1da20 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79  h upper.  ** lay
1da30 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ers, we need to 
1da40 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65  report this file
1da50 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76   size as zero ev
1da60 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a  en though it is.
1da70 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20    ** really 1.  
1da80 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20   Ticket #3260.. 
1da90 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65   */.  if( *pSize
1daa0 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30  ==1 ) *pSize = 0
1dab0 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ;...  return SQL
1dac0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
1dad0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1dae0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1daf0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1db00 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66  ./*.** Handler f
1db10 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  or proxy-locking
1db20 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65   file-control ve
1db30 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65  rbs.  Defined be
1db40 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72  low in the.** pr
1db50 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64  oxying locking d
1db60 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ivision..*/.stat
1db70 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
1db80 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1db90 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29  file*,int,void*)
1dba0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a  ;.#endif../* .**
1dbb0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1dbc0 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64  s called to hand
1dbd0 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  le the SQLITE_FC
1dbe0 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a  NTL_SIZE_HINT .*
1dbf0 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f  * file-control o
1dc00 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72  peration.  Enlar
1dc10 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ge the database 
1dc20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a  to nBytes in siz
1dc30 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70  e.** (rounded up
1dc40 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75   to the next chu
1dc50 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68  nk-size).  If th
1dc60 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
1dc70 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20  ready.** nBytes 
1dc80 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20  or larger, this 
1dc90 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1dca0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
1dcb0 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  t fcntlSizeHint(
1dcc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
1dcd0 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
1dce0 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1dcf0 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  k>0 ){.    i64 n
1dd00 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1dd10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1dd20 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1dd30 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
1dd40 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  t buf;          
1dd50 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68      /* Used to h
1dd60 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65  old return value
1dd70 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a  s of fstat() */.
1dd80 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73     .    if( osFs
1dd90 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
1dda0 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  uf) ) return SQL
1ddb0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1ddc0 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
1ddd0 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
1dde0 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
1ddf0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1de00 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
1de10 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
1de20 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
1de30 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
1de40 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
1de50 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
1de60 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
1de70 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
1de80 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
1de90 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
1dea0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
1deb0 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
1dec0 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
1ded0 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
1dee0 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
1def0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
1df00 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
1df10 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
1df20 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
1df30 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
1df40 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
1df50 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
1df60 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
1df70 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
1df80 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
1df90 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
1dfa0 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
1dfb0 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
1dfc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
1dfd0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1dfe0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
1dff0 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
1e000 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
1e010 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
1e020 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
1e030 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20   First use.     
1e040 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20   ** ftruncate() 
1e050 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20  to set the file 
1e060 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65  size, then write
1e070 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
1e080 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  o.      ** the l
1e090 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68  ast byte in each
1e0a0 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68   block within th
1e0b0 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1e0c0 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a  n. This.      **
1e0d0 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63   is the same tec
1e0e0 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67  hnique used by g
1e0f0 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  libc to implemen
1e100 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  t posix_fallocat
1e110 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  e().      ** on 
1e120 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20  systems that do 
1e130 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1e140 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74  fallocate() syst
1e150 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  em call..      *
1e160 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1e170 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1e180 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1e190 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1e1a0 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1e1b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e1c0 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1e1d0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1e1e0 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  ..      iWrite =
1e1f0 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b   ((buf.st_size +
1e200 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c   2*nBlk - 1)/nBl
1e210 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20  k)*nBlk-1;.     
1e220 20 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c 6e   while( iWrite<n
1e230 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1e240 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65 65  int nWrite = see
1e250 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1e260 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b   iWrite, "", 1);
1e270 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72  .        if( nWr
1e280 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20  ite!=1 ) return 
1e290 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1e2a0 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72 69  TE;.        iWri
1e2b0 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20  te += nBlk;.    
1e2c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 6f    }.      if( ro
1e2d0 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1e2e0 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20  File->h, nSize) 
1e2f0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1e300 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1e310 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
1e320 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1e330 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1e340 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1e350 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1e360 68 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  h);.      }.#end
1e370 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  if.    }.  }..#i
1e380 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1e390 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
1e3a0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1e3b0 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69  x>0 && nByte>pFi
1e3c0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1e3d0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1e3e0 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1e3f0 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  nk<=0 ){.      i
1e400 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
1e410 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  ate(pFile->h, nB
1e420 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  yte) ){.        
1e430 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1e440 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
1e450 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1e460 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1e470 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1e480 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1e490 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1e4a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1e4b0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
1e4c0 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  le, nByte);.    
1e4d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
1e4e0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1e4f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1e500 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
1e510 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  initially negati
1e520 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
1e530 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
1e540 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
1e550 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1e560 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
1e570 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
1e580 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
1e590 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
1e5a0 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
1e5b0 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
1e5c0 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
1e5d0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
1e5e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1e5f0 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46  nixModeBit(unixF
1e600 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
1e610 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
1e620 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
1e630 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
1e640 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
1e650 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
1e660 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
1e670 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
1e680 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1e690 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
1e6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
1e6b0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
1e6c0 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
1e6d0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1e6e0 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
1e6f0 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
1e700 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
1e710 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a  r *zBuf);../*.**
1e720 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
1e730 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
1e740 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
1e750 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1e760 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
1e770 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1e780 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
1e790 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  Arg){.  unixFile
1e7a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1e7b0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63  ile*)id;.  switc
1e7c0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1e7d0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
1e7e0 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
1e7f0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
1e800 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1e810 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e830 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e840 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
1e850 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1e860 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
1e870 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
1e880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e890 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e8a0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
1e8b0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
1e8c0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
1e8d0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
1e8e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e8f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1e900 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1e910 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
1e920 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
1e930 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1e940 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1e950 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69  rc = fcntlSizeHi
1e960 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20  nt(pFile, *(i64 
1e970 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53  *)pArg);.      S
1e980 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1e990 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72  nign(0);.      r
1e9a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e9b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e9c0 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
1e9d0 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  L: {.      unixM
1e9e0 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
1e9f0 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  IXFILE_PERSIST_W
1ea00 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
1ea10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ea20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1ea30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ea40 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
1ea50 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
1ea60 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
1ea70 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53  ile, UNIXFILE_PS
1ea80 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  OW, (int*)pArg);
1ea90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1eaa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1eab0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1eac0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
1ead0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
1eae0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
1eaf0 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c  rintf("%s", pFil
1eb00 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b  e->pVfs->zName);
1eb10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1eb20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1eb30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1eb40 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
1eb50 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  E: {.      char 
1eb60 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  *zTFile = sqlite
1eb70 33 5f 6d 61 6c 6c 6f 63 28 20 70 46 69 6c 65 2d  3_malloc( pFile-
1eb80 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1eb90 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  e );.      if( z
1eba0 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  TFile ){.       
1ebb0 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
1ebc0 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78  (pFile->pVfs->mx
1ebd0 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65  Pathname, zTFile
1ebe0 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61  );.        *(cha
1ebf0 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c  r**)pArg = zTFil
1ec00 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
1ec10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ec20 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1ec30 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48  e SQLITE_FCNTL_H
1ec40 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20  AS_MOVED: {.    
1ec50 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
1ec60 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69  fileHasMoved(pFi
1ec70 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  le);.      retur
1ec80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1ec90 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
1eca0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1ecb0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1ecc0 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
1ecd0 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69  .      i64 newLi
1ece0 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72  mit = *(i64*)pAr
1ecf0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  g;.      int rc 
1ed00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1ed10 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1ed20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ed30 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20  fig.mxMmap ){.  
1ed40 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
1ed50 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1ed60 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20  nfig.mxMmap;.   
1ed70 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34     }.      *(i64
1ed80 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1ed90 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
1eda0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1edb0 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
1edc0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1edd0 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
1ede0 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
1edf0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1ee00 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
1ee10 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  it;.        if( 
1ee20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e  pFile->mmapSize>
1ee30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
1ee40 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
1ee50 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
1ee60 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
1ee70 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20  pFile, -1);.    
1ee80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ee90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1eea0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64     }.#endif.#ifd
1eeb0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1eec0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1eed0 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1eee0 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1eef0 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1ef00 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1ef10 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1ef20 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1ef30 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1ef40 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1ef50 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1ef60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1ef70 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1ef80 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1ef90 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1efa0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1efb0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1efc0 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1efd0 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1efe0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1eff0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f000 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1f010 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1f020 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1f030 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1f040 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1f050 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
1f060 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1f070 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
1f080 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
1f090 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
1f0a0 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
1f0b0 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
1f0c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1f0d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1f0e0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1f0f0 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20  PLE__) */.  }.  
1f100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1f110 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
1f120 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1f130 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
1f140 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1f150 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
1f160 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
1f170 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
1f180 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
1f190 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
1f1a0 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
1f1b0 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
1f1c0 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
1f1d0 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
1f1e0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
1f1f0 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
1f200 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
1f210 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
1f220 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1f230 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
1f240 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
1f250 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
1f260 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
1f270 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
1f280 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1f290 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
1f2a0 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64  r both..*/.#ifnd
1f2b0 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73  ef __QNXNTO__ .s
1f2c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
1f2d0 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1f2e0 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
1f2f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f300 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1f310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
1f320 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
1f330 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E;.}.#endif../*.
1f340 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f350 20 76 65 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78   version of unix
1f360 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
1f370 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e  optimized for QN
1f380 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51  X..*/.#ifdef __Q
1f390 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65  NXNTO__.#include
1f3a0 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68   <sys/dcmd_blk.h
1f3b0 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
1f3c0 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74 69  statvfs.h>.stati
1f3d0 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
1f3e0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1f3f0 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
1f400 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1f410 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28  xFile*)id;.  if(
1f420 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f430 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  ze == 0 ){.    s
1f440 74 72 75 63 74 20 73 74 61 74 76 66 73 20 66 73  truct statvfs fs
1f450 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20  Info;.       .  
1f460 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74    /* Set default
1f470 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72  s for non-suppor
1f480 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d 73 20  ted filesystems 
1f490 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  */.    pFile->se
1f4a0 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54  ctorSize = SQLIT
1f4b0 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
1f4c0 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65  _SIZE;.    pFile
1f4d0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f4e0 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20  ristics = 0;.   
1f4f0 20 69 66 28 20 66 73 74 61 74 76 66 73 28 70 46   if( fstatvfs(pF
1f500 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29  ile->h, &fsInfo)
1f510 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20   == -1 ) {.     
1f520 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73   return pFile->s
1f530 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d  ectorSize;.    }
1f540 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72 63 6d  ..    if( !strcm
1f550 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
1f560 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a  ype, "tmp") ) {.
1f570 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1f580 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1f590 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1f5a0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1f5b0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1f5c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f5d0 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20  CAP_ATOMIC4K |  
1f5e0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20       /* All ram 
1f5f0 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65  filesystem write
1f600 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
1f610 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f620 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1f630 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1f640 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1f650 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f680 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1f690 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1f6a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f6b0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1f6c0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1f6d0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1f6e0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1f720 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1f730 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1f740 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
1f750 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65  o.f_basetype, "e
1f760 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  tfs") ){.      p
1f770 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f780 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1f790 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1f7a0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1f7b0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1f7c0 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65 72 20  /* etfs cluster 
1f7d0 73 69 7a 65 20 77 72 69 74 65 73 20 61 72 65 20  size writes are 
1f7e0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1f7f0 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72    (pFile->sector
1f800 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
1f810 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f820 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53  512) |.        S
1f830 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1f840 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
1f850 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
1f860 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1f870 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1f8a0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
1f8b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
1f8c0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1f8d0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1f8e0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1f8f0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1f900 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f920 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1f930 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1f940 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1f950 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
1f960 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
1f970 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b  type, "qnx6") ){
1f980 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
1f990 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
1f9a0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
1f9b0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1f9c0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1f9d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f9e0 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20  OCAP_ATOMIC |   
1f9f0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c        /* All fil
1fa00 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
1fa10 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
1fa20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fa30 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
1fa40 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
1fa50 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1fa60 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
1faa0 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
1fab0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fac0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1fad0 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1fae0 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1faf0 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1fb30 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1fb40 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1fb50 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
1fb60 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78  f_basetype, "qnx
1fb70 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  4") ){.      pFi
1fb80 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1fb90 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1fba0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1fbb0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fbc0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1fbd0 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
1fbe0 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
1fbf0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
1fc00 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
1fc10 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
1fc20 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1fc30 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1fc40 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
1fc50 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
1fc60 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1fc70 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1fc80 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1fc90 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1fca0 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1fcd0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1fce0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1fcf0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72  }else if( strstr
1fd00 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
1fd10 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20  pe, "dos") ){.  
1fd20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1fd30 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1fd40 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1fd50 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1fd60 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1fd70 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
1fd80 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
1fd90 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
1fda0 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
1fdb0 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
1fdc0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
1fdd0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
1fde0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
1fdf0 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
1fe00 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fe10 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1fe20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1fe30 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1fe40 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1fe80 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1fe90 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1fea0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1feb0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fec0 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
1fed0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1fee0 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63  2 |      /* bloc
1fef0 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  ks are atomic */
1ff00 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1ff10 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1ff20 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
1ff30 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
1ff40 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
1ff80 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
1ff90 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a         0;.    }.
1ffa0 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68    }.  /* Last ch
1ffb0 61 6e 63 65 20 76 65 72 69 66 69 63 61 74 69 6f  ance verificatio
1ffc0 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 74 6f  n.  If the secto
1ffd0 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d  r size isn't a m
1ffe0 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20  ultiple of 512. 
1fff0 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27   ** then it isn'
20000 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28  t valid.*/.  if(
20010 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
20020 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b  ze % 512 != 0 ){
20030 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69  .    pFile->devi
20040 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20050 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  s = 0;.    pFile
20060 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53  ->sectorSize = S
20070 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
20080 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20  CTOR_SIZE;.  }. 
20090 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73   return pFile->s
200a0 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e  ectorSize;.}.#en
200b0 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f  dif /* __QNXNTO_
200c0 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  _ */../*.** Retu
200d0 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68  rn the device ch
200e0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f  aracteristics fo
200f0 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  r the file..**.*
20100 2a 20 54 68 69 73 20 56 46 53 20 69 73 20 73 65  * This VFS is se
20110 74 20 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53  t up to return S
20120 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
20130 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
20140 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48  by default..** H
20150 6f 77 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f  owever, that cho
20160 69 63 65 20 69 73 20 63 6f 6e 74 72 6f 76 65 72  ice is controver
20170 73 69 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e  sial since techn
20180 69 63 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72  ically the under
20190 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79  lying.** file sy
201a0 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c  stem does not al
201b0 77 61 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77  ways provide pow
201c0 65 72 73 61 66 65 20 6f 76 65 72 77 72 69 74 65  ersafe overwrite
201d0 73 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a  s.  (In other.**
201e0 20 77 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20   words, after a 
201f0 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74  power-loss event
20200 2c 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 66  , parts of the f
20210 69 6c 65 20 74 68 61 74 20 77 65 72 65 20 6e 65  ile that were ne
20220 76 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d  ver.** written m
20230 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
20240 67 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77  g altered.)  How
20250 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62  ever, non-PSOW b
20260 65 68 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c  ehavior is very,
20270 0a 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20  .** very rare.  
20280 41 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50 53  And asserting PS
20290 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65  OW makes a large
202a0 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68   reduction in th
202b0 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72  e amount.** of r
202c0 65 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20  equired I/O for 
202d0 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63  journaling, sinc
202e0 65 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69  e a lot of paddi
202f0 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64  ng is eliminated
20300 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69  ..**  Hence, whi
20310 6c 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  le POWERSAFE_OVE
20320 52 57 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20  RWRITE is on by 
20330 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69  default, there i
20340 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  s a file-control
20350 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  .** available to
20360 20 74 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64   turn it off and
20370 20 55 52 49 20 71 75 65 72 79 20 70 61 72 61 6d   URI query param
20380 65 74 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74  eter available t
20390 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a  o turn it off..*
203a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
203b0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
203c0 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
203d0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
203e0 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46  File *p = (unixF
203f0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
20400 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f  c = 0;.#ifdef __
20410 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70  QNXNTO__.  if( p
20420 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20  ->sectorSize==0 
20430 29 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  ) unixSectorSize
20440 28 69 64 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  (id);.  rc = p->
20450 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20460 73 74 69 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20  stics;.#endif.  
20470 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73  if( p->ctrlFlags
20480 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57   & UNIXFILE_PSOW
20490 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d 20 53 51   ){.    rc |= SQ
204a0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
204b0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a  SAFE_OVERWRITE;.
204c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
204d0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
204e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
204f0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
20500 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a  MMAP_SIZE>0../*.
20510 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 79  ** Return the sy
20520 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a  stem page size..
20530 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
20540 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ion should not b
20550 65 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c  e called directl
20560 79 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20  y by other code 
20570 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a  in this file. .*
20580 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 73 68  * Instead, it sh
20590 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 76  ould be called v
205a0 69 61 20 6d 61 63 72 6f 20 6f 73 47 65 74 70 61  ia macro osGetpa
205b0 67 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61  gesize()..*/.sta
205c0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70  tic int unixGetp
205d0 61 67 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23  agesize(void){.#
205e0 69 66 20 64 65 66 69 6e 65 64 28 5f 42 53 44 5f  if defined(_BSD_
205f0 53 4f 55 52 43 45 29 0a 20 20 72 65 74 75 72 6e  SOURCE).  return
20600 20 67 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a   getpagesize();.
20610 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28  #else.  return (
20620 69 6e 74 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f  int)sysconf(_SC_
20630 50 41 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69  PAGESIZE);.#endi
20640 66 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21  f.}..#endif /* !
20650 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20660 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
20670 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20680 3e 30 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  >0 */..#ifndef S
20690 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
206a0 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
206b0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
206c0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
206d0 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20  buffer.  .**.** 
206e0 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
206f0 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
20700 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c  nce the same wal
20710 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72  -index, each thr
20720 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f  ead.** has its o
20730 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  wn unixShm objec
20740 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20  t, but they all 
20750 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
20760 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66  e instance.** of
20770 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
20780 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  e object.  In ot
20790 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20  her words, each 
207a0 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65  wal-index is ope
207b0 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65  ned.** only once
207c0 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
207d0 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d  .** Each unixShm
207e0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
207f0 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69  onnected to a si
20800 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ngle unixInodeIn
20810 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65  fo object..** We
20820 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20   could coalesce 
20830 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f  this object into
20840 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20   unixInodeInfo, 
20850 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  but that would m
20860 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65  ean.** every ope
20870 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73  n file that does
20880 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20   not use shared 
20890 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72  memory (in other
208a0 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20   words, most.** 
208b0 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c  open files) woul
208c0 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20  d have to carry 
208d0 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72  around this extr
208e0 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  a information.  
208f0 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e  So.** the unixIn
20900 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  odeInfo object c
20910 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
20920 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68  r to this unixSh
20930 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  mNode object.** 
20940 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  and the unixShmN
20950 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  ode object is cr
20960 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20  eated only when 
20970 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e  needed..**.** un
20980 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  ixMutexHeld() mu
20990 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
209a0 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
209b0 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
209c0 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
209d0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
209e0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
209f0 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
20a00 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68     nRef.**.** Th
20a10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
20a20 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
20a30 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
20a40 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
20a50 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
20a60 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
20a70 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69  **.** Either uni
20a80 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  xShmNode.mutex m
20a90 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75  ust be held or u
20aa0 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
20ab0 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75  =0 and.** unixMu
20ac0 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
20ad0 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
20ae0 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
20af0 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
20b00 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
20b10 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
20b20 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e  mNode {.  unixIn
20b30 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
20b40 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64       /* unixInod
20b50 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20  eInfo that owns 
20b60 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f  this SHM node */
20b70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
20b80 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
20b90 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
20ba0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
20bb0 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
20bc0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
20bd0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70  Name of the mmap
20be0 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
20bf0 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
20c00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
20c10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
20c20 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
20c30 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
20c40 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
20c50 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
20c60 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69  s */.  u16 nRegi
20c70 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
20c80 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
20c90 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
20ca0 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20   u8 isReadonly; 
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20cc0 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79  rue if read-only
20cd0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52   */.  char **apR
20ce0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
20cf0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70   /* Array of map
20d00 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ped shared-memor
20d10 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
20d20 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
20d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20d40 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f  ber of unixShm o
20d50 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
20d60 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69  to this */.  uni
20d70 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  xShm *pFirst;   
20d80 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75          /* All u
20d90 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
20da0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
20db0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
20dc0 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c  _DEBUG.  u8 excl
20dd0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
20de0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
20df0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
20e00 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72  eld */.  u8 shar
20e10 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
20e20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
20e30 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
20e40 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d   */.  u8 nextShm
20e50 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
20e60 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
20e70 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61  le unixShm.id va
20e80 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
20e90 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
20ea0 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
20eb0 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
20ec0 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
20ed0 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
20ee0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
20ef0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
20f00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
20f10 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
20f20 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
20f30 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
20f40 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
20f50 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
20f60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53  :.**.**    unixS
20f70 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75  hm.pFile.**    u
20f80 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20  nixShm.id.**.** 
20f90 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73  All other fields
20fa0 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
20fb0 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46    The unixShm.pF
20fc0 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ile->mutex must 
20fd0 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
20fe0 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
20ff0 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
21000 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
21010 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  Shm {.  unixShmN
21020 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
21030 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
21040 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ying unixShmNode
21050 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69   object */.  uni
21060 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  xShm *pNext;    
21070 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
21080 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65  unixShm with the
21090 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64   same unixShmNod
210a0 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
210b0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
210c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
210d0 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d  ding the unixShm
210e0 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
210f0 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
21100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
21110 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
21120 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75  ion within its u
21130 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
21140 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
21150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
21160 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
21170 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
21180 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
21190 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
211a0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
211b0 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f  ks held */.};../
211c0 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
211d0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
211e0 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
211f0 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
21200 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
21210 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20  )*4)         /* 
21220 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
21230 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
21240 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58  SHM_DMS    (UNIX
21250 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
21260 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
21270 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
21280 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70  /../*.** Apply p
21290 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
212a0 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65  cks for all byte
212b0 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f  s from ofst thro
212c0 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a  ugh ofst+n-1..**
212d0 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20  .** Locks block 
212e0 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65  if the mask is e
212f0 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f  xactly UNIX_SHM_
21300 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c  C and are non-bl
21310 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77  ocking.** otherw
21320 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
21330 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  nt unixShmSystem
21340 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e  Lock(.  unixShmN
21350 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f  ode *pShmNode, /
21360 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
21370 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
21380 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
21390 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
213a0 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe,          /* 
213b0 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b  F_UNLCK, F_RDLCK
213c0 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a  , or F_WRLCK */.
213d0 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
213e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
213f0 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f  t byte of the lo
21400 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20  cking range */. 
21410 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20   int n          
21420 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21430 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
21440 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
21450 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20  t flock f;      
21460 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64   /* The posix ad
21470 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73  visory locking s
21480 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
21490 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
214a0 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f  ;   /* Result co
214b0 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20  de form fcntl() 
214c0 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
214d0 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  to the unixShmNo
214e0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
214f0 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
21500 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
21510 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
21520 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  _held(pShmNode->
21530 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f  mutex) || pShmNo
21540 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  de->nRef==0 );..
21550 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b    /* Shared lock
21560 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72  s never span mor
21570 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20  e than one byte 
21580 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  */.  assert( n==
21590 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46  1 || lockType!=F
215a0 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  _RDLCK );..  /* 
215b0 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e  Locks are within
215c0 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65   range */.  asse
215d0 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51  rt( n>=1 && n<SQ
215e0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
215f0 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
21600 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f  e->h>=0 ){.    /
21610 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
21620 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
21630 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ers */.    memse
21640 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&f, 0, sizeof(
21650 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70  f));.    f.l_typ
21660 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
21670 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
21680 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c  EEK_SET;.    f.l
21690 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
216a0 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a     f.l_len = n;.
216b0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
216c0 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46  l(pShmNode->h, F
216d0 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20  _SETLK, &f);.   
216e0 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
216f0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
21700 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
21710 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
21720 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
21730 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
21740 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
21750 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21760 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
21770 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
21780 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
21790 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66  ofst>31 ? 0xffff
217a0 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   : (1<<(ofst+n))
217b0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
217c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
217d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
217e0 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
217f0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
21800 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
21810 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
21820 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
21830 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
21840 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
21850 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
21860 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
21870 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
21880 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21890 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
218a0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
218b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
218c0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
218d0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
218e0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
218f0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
21900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
21910 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
21920 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21930 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
21940 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
21950 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
21960 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
21970 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21980 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
21990 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
219a0 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
219b0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
219c0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
219d0 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
219e0 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
219f0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
21a00 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
21a10 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
21a20 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
21a30 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
21a40 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
21a50 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
21a60 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21a70 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
21a80 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
21a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
21aa0 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
21ab0 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
21ac0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
21ad0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
21ae0 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
21af0 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
21b00 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
21b10 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  c;        .}../*
21b20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
21b30 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
21b40 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e   32KB shm region
21b50 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
21b60 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20   mapped at.** a 
21b70 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  time, assuming t
21b80 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67  hat each mapping
21b90 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65   must be an inte
21ba0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
21bb0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73  the.** current s
21bc0 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e  ystem page-size.
21bd0 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
21be0 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65  this is 1. The e
21bf0 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74  xception seems t
21c00 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61  o be systems tha
21c10 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  t are configured
21c20 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20  .** to use 64KB 
21c30 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20  pages - in this 
21c40 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e  case each mappin
21c50 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20  g must cover at 
21c60 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d  least two.** shm
21c70 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61   regions..*/.sta
21c80 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
21c90 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64  egionPerMap(void
21ca0 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d  ){.  int shmsz =
21cb0 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20   32*1024;       
21cc0 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69       /* SHM regi
21cd0 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  on size */.  int
21ce0 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67   pgsz = osGetpag
21cf0 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79  esize();   /* Sy
21d00 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a  stem page size *
21d10 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67  /.  assert( ((pg
21d20 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29  sz-1)&pgsz)==0 )
21d30 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  ;   /* Page size
21d40 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
21d50 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70   of 2 */.  if( p
21d60 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75  gsz<shmsz ) retu
21d70 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn 1;.  return p
21d80 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a  gsz/shmsz;.}../*
21d90 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
21da0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
21db0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
21dc0 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
21dd0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
21de0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
21df0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21e00 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
21e10 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
21e20 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
21e30 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21e40 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
21e50 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
21e60 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
21e70 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
21e80 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
21e90 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
21ea0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
21eb0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
21ec0 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
21ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
21ee0 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
21ef0 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
21f00 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  );.    int i;.  
21f10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
21f20 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
21f30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
21f40 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
21f50 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
21f60 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
21f70 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b   i+=nShmPerMap){
21f80 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  .      if( p->h>
21f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  =0 ){.        os
21fa0 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69  Munmap(p->apRegi
21fb0 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69  on[i], p->szRegi
21fc0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  on);.      }else
21fd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21fe0 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
21ff0 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  on[i]);.      }.
22000 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22010 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
22020 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  on);.    if( p->
22030 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h>=0 ){.      ro
22040 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20  bust_close(pFd, 
22050 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  p->h, __LINE__);
22060 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31  .      p->h = -1
22070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
22080 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
22090 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
220a0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
220b0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
220c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
220d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
220e0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
220f0 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20  ile pDbFd.  .** 
22100 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
22110 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
22120 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ses mmapped file
22130 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  s..**.** The fil
22140 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22150 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ent shared-memor
22160 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  y is in the same
22170 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73   directory.** as
22180 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
22190 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20  se file and has 
221a0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
221b0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
221c0 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20  se.** file with 
221d0 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69  the "-shm" suffi
221e0 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78  x added.  For ex
221f0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61  ample, if the da
22200 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
22210 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  s "/home/user1/c
22220 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74  onfig.db" then t
22230 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  he file that is 
22240 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70  created and mmap
22250 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65  ped.** for share
22260 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
22270 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75   called "/home/u
22280 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73  ser1/config.db-s
22290 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f  hm".  .**.** Ano
222a0 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f  ther approach to
222b0 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73   is to use files
222c0 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20   in /dev/shm or 
222d0 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a  /dev/tmp or an.*
222e0 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70  * some other tmp
222f0 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66  fs mount. But if
22300 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66   a file in a dif
22310 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  ferent directory
22320 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74  .** from the dat
22330 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73  abase file is us
22340 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69  ed, then differi
22350 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  ng access permis
22360 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68  sions.** or a ch
22370 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75  root() might cau
22380 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74  se two different
22390 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68   processes on th
223a0 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61  e same.** databa
223b0 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69  se to end up usi
223c0 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  ng different fil
223d0 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  es for shared me
223e0 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69  mory - .** meani
223f0 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65  ng that their me
22400 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72  mory would not r
22410 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20  eally be shared 
22420 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69  - resulting.** i
22430 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  n database corru
22440 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65  ption.  Neverthe
22450 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73  less, this tmpfs
22460 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63   file usage.** c
22470 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74  an be enabled at
22480 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
22490 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d  ing -DSQLITE_SHM
224a0 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76  _DIRECTORY="/dev
224b0 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20  /shm".** or the 
224c0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65  equivalent.  The
224d0 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49   use of the SQLI
224e0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
224f0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a   compile-time.**
22500 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20   option results 
22510 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
22520 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69  le build of SQLi
22530 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53  te;  builds of S
22540 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69  QLite.** that wi
22550 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c  th differing SQL
22560 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22570 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d  Y settings attem
22580 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  pt to use the.**
22590 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
225a0 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ile at the same 
225b0 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63  time, database c
225c0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c  orruption will l
225d0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e  ikely.** result.
225e0 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   The SQLITE_SHM_
225f0 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
22600 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
22610 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22   considered.** "
22620 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64  unsupported" and
22630 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20   may go away in 
22640 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20  a future SQLite 
22650 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  release..**.** W
22660 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
22670 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
22680 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
22690 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
226a0 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
226b0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
226c0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
226d0 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
226e0 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
226f0 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
22700 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
22710 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
22720 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
22730 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
22740 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
22750 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29  ase file (pDbFd)
22760 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75   is using the "u
22770 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a  nix-excl" VFS.**
22780 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
22790 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
227a0 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
227b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
227c0 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f  and.** that no o
227d0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
227e0 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  re able to read 
227f0 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74  or write the dat
22800 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68  abase.  In.** th
22810 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e  at case, we do n
22820 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73  ot really need s
22830 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e  hared memory.  N
22840 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a  o shared memory.
22850 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ** file is creat
22860 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20  ed.  The shared 
22870 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73  memory will be s
22880 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65  imulated with he
22890 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ap memory..*/.st
228a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
228b0 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  nSharedMemory(un
228c0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  ixFile *pDbFd){.
228d0 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
228e0 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
228f0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
22900 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
22910 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
22920 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
22930 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  de;   /* The und
22940 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
22950 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
22960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
22980 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  ult code */.  un
22990 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
229a0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
229b0 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64   The inode of fd
229c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d   */.  char *zShm
229d0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
229e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
229f0 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
22a00 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20  or SHM */.  int 
22a10 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  nShmFilename;   
22a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22a30 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66  ize of the SHM f
22a40 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  ilename in bytes
22a50 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
22a60 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
22a70 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a   new unixShm obj
22a80 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71  ect. */.  p = sq
22a90 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
22aa0 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
22ab0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
22ac0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22ad0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
22ae0 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65  eof(*p));.  asse
22af0 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
22b00 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
22b10 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e  k to see if a un
22b20 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
22b30 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
22b40 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   Reuse an existi
22b50 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70  ng.  ** one if p
22b60 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61  resent. Create a
22b70 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
22b80 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e  ssary..  */.  un
22b90 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
22ba0 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64    pInode = pDbFd
22bb0 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d  ->pInode;.  pShm
22bc0 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Node = pInode->p
22bd0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70  ShmNode;.  if( p
22be0 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
22bf0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
22c00 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
22c10 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20       /* fstat() 
22c20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73  info for databas
22c30 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  e file */..    /
22c40 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74  * Call fstat() t
22c50 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
22c60 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
22c70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22c80 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e  e. If.    ** a n
22c90 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73  ew *-shm file is
22ca0 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74   created, an att
22cb0 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64  empt will be mad
22cc0 65 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20  e to create it. 
22cd0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73     ** with the s
22ce0 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ame permissions.
22cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22d00 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
22d10 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
22d20 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
22d30 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
22d40 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
22d50 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
22d60 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22d70 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
22d80 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22d90 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
22da0 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
22db0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22dc0 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20  Y) + 31;.#else. 
22dd0 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
22de0 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 6 + (int)strle
22df0 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  n(pDbFd->zPath);
22e00 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
22e10 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Node = sqlite3_m
22e20 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
22e30 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46  ShmNode) + nShmF
22e40 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69  ilename );.    i
22e50 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
22e60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22e70 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
22e80 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
22e90 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rr;.    }.    me
22ea0 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30  mset(pShmNode, 0
22eb0 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  , sizeof(*pShmNo
22ec0 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  de)+nShmFilename
22ed0 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e  );.    zShmFilen
22ee0 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ame = pShmNode->
22ef0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
22f00 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b  r*)&pShmNode[1];
22f10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
22f20 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
22f30 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22f40 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
22f50 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  zShmFilename, . 
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44      SQLITE_SHM_D
22f80 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74  IRECTORY "/sqlit
22f90 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20  e-shm-%x-%x",.  
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74     (u32)sStat.st
22fc0 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74  _ino, (u32)sStat
22fd0 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a  .st_dev);.#else.
22fe0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
22ff0 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
23000 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
23010 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64   "%s-shm", pDbFd
23020 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71  ->zPath);.    sq
23030 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
23040 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a  (pDbFd->zPath, z
23050 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65  ShmFilename);.#e
23060 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
23070 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70  e->h = -1;.    p
23080 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
23090 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
230a0 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
230b0 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d  >pInode = pDbFd-
230c0 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68  >pInode;.    pSh
230d0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73  mNode->mutex = s
230e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
230f0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
23100 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70  FAST);.    if( p
23110 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
23120 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
23130 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23140 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
23150 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
23160 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
23170 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
23180 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46  .      int openF
23190 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
231a0 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69  O_CREAT;.      i
231b0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
231c0 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50  oolean(pDbFd->zP
231d0 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73  ath, "readonly_s
231e0 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  hm", 0) ){.     
231f0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
23200 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  _RDONLY;.       
23210 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
23220 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
23230 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
23240 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70  e->h = robust_op
23250 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  en(zShmFilename,
23260 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74   openFlags, (sSt
23270 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  at.st_mode&0777)
23280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
23290 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
232a0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
232b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
232c0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
232d0 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  pen", zShmFilena
232e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
232f0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
23300 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
23310 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
23320 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
23330 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20  root, make sure 
23340 74 68 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c  that the SHM fil
23350 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77  e.      ** is ow
23360 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
23370 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74  user that owns t
23380 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
23390 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  base.  Otherwise
233a0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  ,.      ** the o
233b0 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69  riginal owner wi
233c0 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
233d0 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20  o connect..     
233e0 20 2a 2f 0a 20 20 20 20 20 20 6f 73 46 63 68 6f   */.      osFcho
233f0 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
23400 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
23410 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a  tat.st_gid);.  .
23420 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
23430 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
23440 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
23450 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
23460 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
23470 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
23480 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
23490 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
234a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
234b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
234c0 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
234d0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
234e0 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
234f0 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
23500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23510 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
23520 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
23530 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
23540 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
23550 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23560 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72  RR_SHMOPEN, "ftr
23570 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c  uncate", zShmFil
23580 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
23590 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
235a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
235b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
235c0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
235d0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
235e0 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  RDLCK, UNIX_SHM_
235f0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  DMS, 1);.      }
23600 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
23610 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
23620 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
23630 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
23640 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
23650 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68  ld of the unixSh
23660 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
23670 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
23680 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
23690 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
236a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
236b0 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
236c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
236d0 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
236e0 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
236f0 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
23700 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
23710 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
23720 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
23730 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
23740 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
23750 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74  r of the unixEnt
23760 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
23770 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
23780 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
23790 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68  w (struct unixSh
237a0 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
237b0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
237c0 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
237d0 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
237e0 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
237f0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
23800 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
23810 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
23820 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
23830 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
23840 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
23850 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
23860 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20  de->mutex .  ** 
23870 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
23880 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
23890 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
238a0 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
238b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
238c0 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
238d0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
238e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
238f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
23900 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23910 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
23920 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
23930 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
23940 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
23950 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
23960 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
23970 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
23980 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
23990 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
239a0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
239b0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
239c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
239d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
239e0 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
239f0 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
23a00 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
23a10 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
23a20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
23a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23a40 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
23a50 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
23a60 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
23a70 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
23a80 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
23a90 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
23aa0 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
23ab0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
23ac0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
23ad0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
23ae0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
23af0 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
23b00 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
23b10 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
23b20 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
23b30 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
23b40 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
23b50 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
23b60 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
23b70 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
23b80 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
23b90 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
23ba0 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
23bb0 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
23bc0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
23bd0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
23be0 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
23bf0 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
23c00 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
23c10 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
23c20 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
23c30 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
23c40 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
23c50 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
23c60 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
23c70 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
23c80 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
23c90 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
23ca0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
23cb0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
23cc0 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
23cd0 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
23ce0 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
23cf0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
23d00 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
23d10 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
23d20 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
23d30 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
23d40 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
23d50 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
23d60 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23d70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23d80 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
23d90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23db0 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
23dc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
23dd0 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
23e00 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
23e10 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e30 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
23e40 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
23e50 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
23e60 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
23e70 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
23e80 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
23e90 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
23ea0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
23eb0 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
23ec0 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
23ed0 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
23ee0 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
23ef0 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
23f00 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
23f10 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
23f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
23f30 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
23f40 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
23f50 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52  p();.  int nReqR
23f60 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  egion;..  /* If 
23f70 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
23f80 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
23f90 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
23fa0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
23fb0 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
23fc0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
23fd0 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
23fe0 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
23ff0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24000 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
24010 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
24020 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
24030 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
24040 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
24050 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
24060 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
24070 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
24080 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
24090 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
240a0 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61  Region==0 );.  a
240b0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
240c0 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
240d0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
240e0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
240f0 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
24100 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
24110 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
24120 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
24130 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
24140 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
24150 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d  0 );..  /* Minim
24160 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67  um number of reg
24170 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f  ions required to
24180 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20   be mapped. */. 
24190 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28 28   nReqRegion = ((
241a0 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d  iRegion+nShmPerM
241b0 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70  ap) / nShmPerMap
241c0 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a  ) * nShmPerMap;.
241d0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
241e0 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
241f0 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ion ){.    char 
24200 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20  **apNew;        
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24220 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20   New apRegion[] 
24230 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
24240 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65 67   nByte = nReqReg
24250 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20  ion*szRegion;   
24260 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
24270 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
24280 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
24290 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
242a0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
242b0 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20  by fstat() */.. 
242c0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
242d0 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
242e0 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ;..    if( pShmN
242f0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
24300 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
24310 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
24320 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
24330 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
24340 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
24350 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
24360 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
24370 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
24380 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
24390 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20  x file is.      
243a0 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
243b0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
243c0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
243d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
243e0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68   if( osFstat(pSh
243f0 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74  mNode->h, &sStat
24400 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
24410 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
24420 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  HMSIZE;.        
24430 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
24450 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f     if( sStat.st_
24460 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20  size<nByte ){.  
24470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
24480 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
24490 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
244a0 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20  ist. If bExtend 
244b0 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
244c0 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74    ** false, exit
244d0 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
244e0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
244f0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
24500 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20  turned..        
24510 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
24520 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20 20  bExtend ){.     
24530 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24540 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
24550 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 74  ..        /* Alt
24560 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62  ernatively, if b
24570 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20  Extend is true, 
24580 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e  extend the file.
24590 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20 20   Do this by.    
245a0 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 61      ** writing a
245b0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
245c0 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20  the end of each 
245d0 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67 0a  (OS) page being.
245e0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
245f0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
24600 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  . Technically, w
24610 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69 74  e need only writ
24620 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  e to the.       
24630 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 6e   ** last page in
24640 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e 64   order to extend
24650 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20 77   the file. But w
24660 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65  riting to all ne
24670 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
24680 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f 53  es forces the OS
24690 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
246a0 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77  m immediately, w
246b0 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20 20  hich reduces.   
246c0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61 6e       ** the chan
246d0 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77 68  ces of SIGBUS wh
246e0 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ile accessing th
246f0 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
24700 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20  later on..      
24710 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c 73    */.        els
24720 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  e{.          sta
24730 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70 67  tic const int pg
24740 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 20  sz = 4096;.     
24750 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20       int iPg;.. 
24760 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
24770 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
24780 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c 79  te of each newly
24790 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78   allocated or ex
247a0 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a 20  tended page */. 
247b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
247c0 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29 3d   (nByte % pgsz)=
247d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
247e0 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e 73  for(iPg=(sStat.s
247f0 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50  t_size/pgsz); iP
24800 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20  g<(nByte/pgsz); 
24810 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPg++){.        
24820 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57      if( seekAndW
24830 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d  riteFd(pShmNode-
24840 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70  >h, iPg*pgsz + p
24850 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 30 29  gsz-1, "", 1, 0)
24860 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=1 ){.         
24870 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24880 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64  *zFile = pShmNod
24890 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  e->zFilename;.  
248a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
248b0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
248c0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
248d0 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69  ZE, "write", zFi
248e0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  le);.           
248f0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
24900 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  out;.           
24910 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
24920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24930 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
24940 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
24950 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
24960 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
24970 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
24980 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
24990 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
249a0 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
249b0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
249c0 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f  egion, nReqRegio
249d0 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  n*sizeof(char *)
249e0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
249f0 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
24a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
24a10 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
24a20 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24a30 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
24a40 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20  ode->apRegion = 
24a50 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65  apNew;.    while
24a60 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
24a70 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29  ion<nReqRegion )
24a80 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70  {.      int nMap
24a90 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d   = szRegion*nShm
24aa0 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e  PerMap;.      in
24ab0 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  t i;.      void 
24ac0 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  *pMem;.      if(
24ad0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
24ae0 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  ){.        pMem 
24af0 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70  = osMmap(0, nMap
24b00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ,.            pS
24b10 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
24b20 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a  ly ? PROT_READ :
24b30 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f   PROT_READ|PROT_
24b40 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20  WRITE, .        
24b50 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20      MAP_SHARED, 
24b60 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52  pShmNode->h, szR
24b70 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e  egion*(i64)pShmN
24b80 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20  ode->nRegion.   
24b90 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
24ba0 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41  if( pMem==MAP_FA
24bb0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
24bc0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
24bd0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
24be0 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c  _SHMMAP, "mmap",
24bf0 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
24c00 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
24c10 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24c20 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
24c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24c40 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33    pMem = sqlite3
24c50 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e  _malloc(szRegion
24c60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
24c70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
24c80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24c90 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
24ca0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24cb0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
24cc0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
24cd0 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
24ce0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
24cf0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65  or(i=0; i<nShmPe
24d00 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rMap; i++){.    
24d10 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
24d20 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
24d30 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28  >nRegion+i] = &(
24d40 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52  (char*)pMem)[szR
24d50 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20  egion*i];.      
24d60 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
24d70 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68  ->nRegion += nSh
24d80 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20  mPerMap;.    }. 
24d90 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
24da0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
24db0 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
24dc0 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
24dd0 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
24de0 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
24df0 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
24e00 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
24e10 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
24e20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
24e30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
24e40 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
24e50 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
24e60 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
24e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24e80 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
24e90 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
24ea0 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
24eb0 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
24ec0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
24ed0 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
24ee0 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
24ef0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
24f00 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
24f10 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
24f20 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
24f30 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
24f40 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
24f50 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
24f60 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
24f70 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
24f80 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
24f90 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
24fa0 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
24fb0 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
24fc0 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
24fd0 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
24fe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
24ff0 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
25000 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
25010 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
25020 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
25030 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
25040 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
25050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25060 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
25070 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
25080 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
25090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
250a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
250b0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
250c0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
250d0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
250f0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
25100 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
25110 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
25120 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
25130 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
25140 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
25150 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
25160 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
25170 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
25180 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
25190 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
251a0 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
251b0 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251d0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
251e0 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
251f0 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
25200 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
25210 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
25220 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
25230 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
25240 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25250 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
25260 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
25270 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
25280 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
252b0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
252c0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
252d0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
252e0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
252f0 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
25300 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
25310 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
25320 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
25330 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
25340 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
25350 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
25360 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
25370 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
25380 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
25390 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
253a0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
253b0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
253c0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
253d0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
253e0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
253f0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
25400 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
25410 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
25420 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
25430 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
25440 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
25450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
25460 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
25470 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
25480 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  VE)!=0 );.  asse
25490 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
254a0 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
254b0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
254c0 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
254d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
254e0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
254f0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
25500 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
25510 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
25520 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
25530 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
25540 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
25550 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
25560 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
25570 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
25580 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
25590 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
255a0 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
255b0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
255c0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
255d0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
255e0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
255f0 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
25600 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
25610 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
25620 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
25630 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
25640 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
25650 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25660 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
25670 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
25680 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
25690 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
256a0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
256b0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
256c0 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
256d0 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
256e0 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
256f0 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
25700 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
25710 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
25720 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b  ShmNode, F_UNLCK
25730 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
25740 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
25750 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
25760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
25770 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
25780 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
25790 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
257a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
257b0 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
257c0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
257d0 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
257e0 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
257f0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
25800 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
25810 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
25820 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
25830 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
25840 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
25850 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
25860 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
25870 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
25880 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
25890 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
258a0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
258b0 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
258c0 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
258d0 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
258e0 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
258f0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
25900 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
25910 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
25920 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
25930 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
25940 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
25950 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
25960 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
25970 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25980 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
25990 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
259a0 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
259b0 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
259c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
259d0 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
259e0 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
259f0 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
25a00 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
25a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25a20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
25a30 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
25a40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
25a50 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
25a60 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
25a70 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
25a80 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
25a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25aa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25ac0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
25ad0 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
25ae0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25b00 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
25b10 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
25b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25b30 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
25b40 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
25b50 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
25b60 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
25b70 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
25b80 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
25b90 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
25ba0 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
25bb0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25bc0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25bd0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25be0 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
25bf0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
25c00 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
25c10 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
25c20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25c30 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
25c40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25c50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
25c60 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
25c70 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
25c80 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
25c90 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
25ca0 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
25cb0 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
25cc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
25cd0 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
25ce0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25cf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25d00 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
25d10 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
25d20 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  de, F_WRLCK, ofs
25d30 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
25d40 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
25d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25d60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25d70 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
25d80 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
25d90 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
25da0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
25db0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
25dc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
25dd0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
25de0 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
25df0 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
25e00 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
25e10 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
25e20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
25e30 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65  tpid(), p->share
25e40 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
25e50 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
25e60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
25e70 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
25e80 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
25e90 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
25ea0 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
25eb0 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
25ec0 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
25ed0 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
25ee0 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
25ef0 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
25f00 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
25f10 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
25f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25f30 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
25f40 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25f50 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
25f60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
25f70 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
25f80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
25f90 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
25fa0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e  AMETER(fd);.  un
25fb0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
25fc0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
25fd0 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
25fe0 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
25ff0 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
26000 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
26010 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
26020 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
26030 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
26040 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
26050 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
26060 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
26070 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
26080 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
26090 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
260a0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
260b0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
260c0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
260d0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
260e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
260f0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
26100 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
26110 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
26120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
26130 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
26140 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
26150 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
26180 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
26190 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
261a0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
261b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
261c0 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
261d0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
261e0 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
26210 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
26220 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
26230 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26250 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
26260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
26270 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
26280 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
26290 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
262a0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
262b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
262c0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
262d0 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
262e0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
262f0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
26300 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
26310 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
26320 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
26330 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
26340 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
26350 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
26360 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
26370 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
26380 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
26390 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
263a0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
263b0 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
263c0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
263d0 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
263e0 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
263f0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
26400 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
26410 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
26420 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26430 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
26440 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
26450 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
26460 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
26470 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
26480 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
26490 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
264a0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
264b0 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
264c0 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
264d0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
264e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
264f0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
26500 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
26510 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
26520 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
26530 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
26540 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
26550 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28  h>=0 ) osUnlink(
26560 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
26570 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68  ame);.    unixSh
26580 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20  mPurge(pDbFd);. 
26590 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
265a0 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
265b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
265c0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
265d0 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  nixShmMap     0.
265e0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
265f0 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
26600 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  ne unixShmBarrie
26610 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  r 0.# define uni
26620 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65  xShmUnmap   0.#e
26630 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
26640 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
26650 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  */..#if SQLITE_M
26660 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
26670 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75  *.** If it is cu
26680 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d  rrently memory m
26690 61 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c  apped, unmap fil
266a0 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pFd..*/.static
266b0 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66   void unixUnmapf
266c0 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
266d0 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  d){.  assert( pF
266e0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
266f0 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  );.  if( pFd->pM
26700 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
26710 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d  osMunmap(pFd->pM
26720 61 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d  apRegion, pFd->m
26730 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a  mapSizeActual);.
26740 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
26750 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64  ion = 0;.    pFd
26760 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
26770 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
26780 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d  eActual = 0;.  }
26790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
267a0 74 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  t to set the siz
267b0 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  e of the memory 
267c0 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e  mapping maintain
267d0 65 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64  ed by file .** d
267e0 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 74 6f  escriptor pFd to
267f0 20 6e 4e 65 77 20 62 79 74 65 73 2e 20 41 6e 79   nNew bytes. Any
26800 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
26810 67 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a  g is discarded..
26820 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
26830 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ful, this functi
26840 6f 6e 20 73 65 74 73 20 74 68 65 20 66 6f 6c 6c  on sets the foll
26850 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a  owing variables:
26860 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  .**.**       uni
26870 78 46 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e  xFile.pMapRegion
26880 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
26890 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20  le.mmapSize.**  
268a0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d       unixFile.mm
268b0 61 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a  apSizeActual.**.
268c0 2a 2a 20 49 66 20 75 6e 73 75 63 63 65 73 73 66  ** If unsuccessf
268d0 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ul, an error mes
268e0 73 61 67 65 20 69 73 20 6c 6f 67 67 65 64 20 76  sage is logged v
268f0 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ia sqlite3_log()
26900 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72 65   and.** the thre
26910 65 20 76 61 72 69 61 62 6c 65 73 20 61 62 6f 76  e variables abov
26920 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e  e are zeroed. In
26930 20 74 68 69 73 20 63 61 73 65 20 53 51 4c 69 74   this case SQLit
26940 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74  e should.** cont
26950 69 6e 75 65 20 61 63 63 65 73 73 69 6e 67 20 74  inue accessing t
26960 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
26970 67 20 74 68 65 20 78 52 65 61 64 28 29 20 61 6e  g the xRead() an
26980 64 20 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65  d xWrite().** me
26990 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
269a0 20 76 6f 69 64 20 75 6e 69 78 52 65 6d 61 70 66   void unixRemapf
269b0 69 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  ile(.  unixFile 
269c0 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20 20 20  *pFd,           
269d0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
269e0 65 73 63 72 69 70 74 6f 72 20 6f 62 6a 65 63 74  escriptor object
269f0 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20 20   */.  i64 nNew  
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a10 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
26a20 64 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 2a  d mapping size *
26a30 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
26a40 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22  r *zErr = "mmap"
26a50 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 64 2d  ;.  int h = pFd-
26a60 3e 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  >h;             
26a70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
26a80 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e   descriptor open
26a90 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20   on db file */. 
26aa0 20 75 38 20 2a 70 4f 72 69 67 20 3d 20 28 75 38   u8 *pOrig = (u8
26ab0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
26ac0 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  on;   /* Pointer
26ad0 20 74 6f 20 63 75 72 72 65 6e 74 20 66 69 6c 65   to current file
26ae0 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36   mapping */.  i6
26af0 34 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d  4 nOrig = pFd->m
26b00 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
26b10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f     /* Size of pO
26b20 72 69 67 20 72 65 67 69 6f 6e 20 69 6e 20 62 79  rig region in by
26b30 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65  tes */.  u8 *pNe
26b40 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b60 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77   Location of new
26b70 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e   mapping */.  in
26b80 74 20 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52  t flags = PROT_R
26b90 45 41 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  EAD;            
26ba0 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
26bb0 61 73 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f  ass to mmap() */
26bc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
26bd0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
26be0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
26bf0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b  pFd->mmapSize );
26c00 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3c  .  assert( nNew<
26c10 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  =pFd->mmapSizeMa
26c20 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  x );.  assert( n
26c30 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  New>0 );.  asser
26c40 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  t( pFd->mmapSize
26c50 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61  Actual>=pFd->mma
26c60 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  pSize );.  asser
26c70 74 28 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30  t( MAP_FAILED!=0
26c80 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 46 64 2d   );..  if( (pFd-
26c90 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
26ca0 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30  XFILE_RDONLY)==0
26cb0 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54   ) flags |= PROT
26cc0 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 70  _WRITE;..  if( p
26cd0 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45  Orig ){.#if HAVE
26ce0 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20  _MREMAP.    i64 
26cf0 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d  nReuse = pFd->mm
26d00 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20  apSize;.#else.  
26d10 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79    const int szSy
26d20 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67  spage = osGetpag
26d30 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34  esize();.    i64
26d40 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e   nReuse = (pFd->
26d50 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53  mmapSize & ~(szS
26d60 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64  yspage-1));.#end
26d70 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20  if.    u8 *pReq 
26d80 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d  = &pOrig[nReuse]
26d90 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20  ;..    /* Unmap 
26da0 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65  any pages of the
26db0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
26dc0 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65  g that cannot be
26dd0 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20   reused. */.    
26de0 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69  if( nReuse!=nOri
26df0 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e  g ){.      osMun
26e00 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d  map(pReq, nOrig-
26e10 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  nReuse);.    }..
26e20 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
26e30 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65      pNew = osMre
26e40 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73  map(pOrig, nReus
26e50 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f  e, nNew, MREMAP_
26e60 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45  MAYMOVE);.    zE
26e70 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23  rr = "mremap";.#
26e80 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
26e90 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65  osMmap(pReq, nNe
26ea0 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c  w-nReuse, flags,
26eb0 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20   MAP_SHARED, h, 
26ec0 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28  nReuse);.    if(
26ed0 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45   pNew!=MAP_FAILE
26ee0 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  D ){.      if( p
26ef0 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20  New!=pReq ){.   
26f00 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e       osMunmap(pN
26f10 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73  ew, nNew - nReus
26f20 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
26f30 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
26f40 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  e{.        pNew 
26f50 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d  = pOrig;.      }
26f60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
26f70 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70     /* The attemp
26f80 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  t to extend the 
26f90 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
26fa0 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74   failed. Free it
26fb0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65  . */.    if( pNe
26fc0 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c  w==MAP_FAILED ||
26fd0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
26fe0 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67    osMunmap(pOrig
26ff0 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d  , nReuse);.    }
27000 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e  .  }..  /* If pN
27010 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c  ew is still NULL
27020 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  , try to create 
27030 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20  an entirely new 
27040 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  mapping. */.  if
27050 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
27060 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30   pNew = osMmap(0
27070 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d  , nNew, flags, M
27080 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29  AP_SHARED, h, 0)
27090 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65  ;.  }..  if( pNe
270a0 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w==MAP_FAILED ){
270b0 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
270c0 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20     nNew = 0;.   
270d0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
270e0 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70  LITE_OK, zErr, p
270f0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20  Fd->zPath);..   
27100 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28   /* If the mmap(
27110 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20  ) above failed, 
27120 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20  assume that all 
27130 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28  subsequent mmap(
27140 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77  ) calls.    ** w
27150 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69  ill probably fai
27160 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b  l too. Fall back
27170 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f   to using xRead/
27180 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65  xWrite exclusive
27190 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  ly.    ** in thi
271a0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
271b0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
271c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d   = 0;.  }.  pFd-
271d0 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76  >pMapRegion = (v
271e0 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46  oid *)pNew;.  pF
271f0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46  d->mmapSize = pF
27200 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
27210 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  l = nNew;.}../*.
27220 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72  ** Memory map or
27230 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20   remap the file 
27240 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64  opened by file-d
27250 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69  escriptor pFd (i
27260 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
27270 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c   already mapped,
27280 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
27290 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65  pping is replace
272a0 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f  d by the new). O
272b0 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  r, if .** there 
272c0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
272d0 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69   mapping for thi
272e0 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  s file, and ther
272f0 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20  e are still .** 
27300 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
27310 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
27320 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
27330 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
27340 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
27350 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
27360 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
27370 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
27380 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20  ted size of .** 
27390 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63  the mapping to c
273a0 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  reate. Otherwise
273b0 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65  , if nByte is le
273c0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
273d0 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  en the .** reque
273e0 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65  sted size is the
273f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
27400 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61  e on disk. The a
27410 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
27420 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70  e.** created map
27430 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74  ping is either t
27440 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
27450 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63  e or the value c
27460 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73  onfigured .** us
27470 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ing SQLITE_FCNTL
27480 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69  _MMAP_LIMIT, whi
27490 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
274a0 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
274b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
274c0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
274d0 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
274e0 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
274f0 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
27500 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
27510 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
27520 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
27530 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
27540 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
27550 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c  c int unixMapfil
27560 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  e(unixFile *pFd,
27570 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
27580 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b  64 nMap = nByte;
27590 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
275a0 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c  sert( nMap>=0 ||
275b0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
275c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d  =0 );.  if( pFd-
275d0 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
275e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
275f0 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
27600 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
27610 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
27620 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
27630 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
27640 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73  n */.    rc = os
27650 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73  Fstat(pFd->h, &s
27660 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28  tatbuf);.    if(
27670 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27680 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
27690 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
276a0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  T;.    }.    nMa
276b0 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73  p = statbuf.st_s
276c0 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ize;.  }.  if( n
276d0 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  Map>pFd->mmapSiz
276e0 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70  eMax ){.    nMap
276f0 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
27700 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Max;.  }..  if( 
27710 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
27720 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ize ){.    if( n
27730 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  Map>0 ){.      u
27740 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
27750 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c  , nMap);.    }el
27760 73 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55 6e  se{.      unixUn
27770 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
27780 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
27790 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
277a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
277b0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
277c0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
277d0 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
277e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
277f0 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
27800 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
27810 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
27820 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
27830 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
27840 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
27850 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
27860 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
27870 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
27880 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
27890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
278a0 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
278b0 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
278c0 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
278d0 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
278e0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
278f0 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
27900 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
27910 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27920 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
27930 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
27940 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
27950 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
27960 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
27970 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
27980 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
27990 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
279a0 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
279b0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
279c0 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75  nce by calling u
279d0 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  nixUnfetch()..*/
279e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
279f0 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
27a00 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
27a10 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
27a20 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
27a30 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
27a40 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
27a50 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
27a60 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
27a70 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
27a80 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
27a90 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66  .  *pp = 0;..#if
27aa0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27ab0 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
27ac0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
27ad0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
27ae0 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
27af0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
27b00 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64   unixMapfile(pFd
27b10 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
27b20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27b40 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
27b50 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
27b60 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
27b70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
27b80 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
27b90 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
27ba0 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
27bb0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
27bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
27be0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
27bf0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
27c00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27c10 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
27c20 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
27c30 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
27c40 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63  call to unixFetc
27c50 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
27c60 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
27c70 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
27c80 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
27c90 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
27ca0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
27cb0 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
27cc0 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69  assed to the uni
27cd0 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  xFetch() invocat
27ce0 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ion. .**.** Or, 
27cf0 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
27d00 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
27d10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27d20 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
27d30 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  d .** to inform 
27d40 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
27d50 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
27d60 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
27d70 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a  ting mapping .**
27d80 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61   may now be inva
27d90 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
27da0 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73  e unmapped..*/.s
27db0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
27dc0 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  fetch(sqlite3_fi
27dd0 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
27de0 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20  , void *p){.#if 
27df0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27e00 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c  SIZE>0.  unixFil
27e10 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
27e20 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
27e30 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
27e40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
27e50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27e60 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66  (iOff);..  /* If
27e70 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
27e80 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
27e90 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
27ea0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
27eb0 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
27ec0 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
27ed0 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
27ee0 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
27ef0 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
27f00 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
27f10 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
27f20 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
27f30 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
27f40 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
27f50 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
27f60 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
27f70 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
27f80 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
27f90 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
27fa0 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
27fb0 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
27fc0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
27fd0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
27fe0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
27ff0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
28000 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
28010 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
28020 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55  >=0 );.#else.  U
28030 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28040 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
28050 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
28060 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
28070 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  Off);.#endif.  r
28080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
280a0 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
280b0 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
280c0 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
280d0 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
280e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
280f0 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
28100 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
28110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28120 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
28130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28170 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
28180 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
28190 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
281a0 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
281b0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
281c0 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
281d0 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
281e0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
281f0 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
28200 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
28210 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
28220 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
28230 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
28240 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
28250 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
28260 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
28270 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
28280 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
28290 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
282a0 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
282b0 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
282c0 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
282d0 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
282e0 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
282f0 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
28300 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
28310 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
28320 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
28330 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
28340 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
28350 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
28360 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
28370 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
28380 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
28390 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
283a0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
283b0 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
283c0 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
283d0 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
283e0 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
283f0 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
28400 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
28410 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
28420 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20  der-function F, 
28430 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
28440 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
28450 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
28460 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
28470 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
28480 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
28490 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
284a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
284b0 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
284c0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
284d0 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
284e0 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
284f0 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
28500 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
28510 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
28520 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
28530 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
28540 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
28550 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
28560 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
28570 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
28580 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
28590 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
285a0 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
285b0 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
285c0 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
285d0 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
285e0 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
285f0 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
28600 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
28610 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28620 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
28630 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
28640 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
28650 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
28660 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
28670 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
28680 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
28690 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
286a0 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
286b0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
286c0 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
286d0 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
286e0 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
286f0 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
28700 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
28710 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f  , METHOD, VERSIO
28720 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  N, CLOSE, LOCK, 
28730 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 2c 20  UNLOCK, CKLOCK, 
28740 53 48 4d 4d 41 50 29 20 5c 0a 73 74 61 74 69 63  SHMMAP) \.static
28750 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
28760 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
28770 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53         \.   VERS
287a0 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ION,            
287b0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
287c0 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
287f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28800 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
28810 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
28840 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
28850 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
28860 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
28890 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
288a0 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
288b0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
288e0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
288f0 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
28900 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
28980 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
28990 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
289a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289e0 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28a10 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28a60 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a80 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28a90 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28ab0 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
28ac0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
28ad0 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28b00 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28b50 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
28b60 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78  teristics,  /* x
28b70 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
28b80 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
28b90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53            \.   S
28ba0 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20  HMMAP,          
28bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28bc0 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  hmMap */        
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28bf0 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ixShmLock,      
28c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
28c10 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  mLock */        
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28c40 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  xShmBarrier,    
28c50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
28c60 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20  Barrier */      
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28c90 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
28ca0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
28cb0 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  nmap */         
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
28ce0 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
28cf0 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
28d00 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e       \.   unixUn
28d30 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  fetch,          
28d40 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
28d50 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d70 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dc0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
28dd0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28de0 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
28df0 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
28e00 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
28e10 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
28e20 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
28e30 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e60 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
28e70 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28f00 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
28f10 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28f20 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
28f30 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
28f40 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
28f50 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
28f60 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
28f70 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
28f80 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28f90 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
28fa0 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
28fb0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
28fc0 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
28fd0 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
28fe0 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
28ff0 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
29000 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
29010 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
29020 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
29030 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29040 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
29050 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
29060 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29070 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29080 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
29090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
290a0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
290b0 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d  ed memory and mm
290c0 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a  ap are enabled *
290d0 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
290f0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29100 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29120 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
29130 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29150 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29160 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
29170 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
29180 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29190 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
291a0 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20  unixShmMap      
291b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
291c0 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
291d0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
291e0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
291f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29200 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
29210 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
29220 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
29230 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29240 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29250 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29280 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29290 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
292a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
292b0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
292c0 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
292d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
292e0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
292f0 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
29300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
29310 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
29320 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
29330 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78  ervedLock,  /* x
29340 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29350 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29380 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
29390 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
293a0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
293b0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
293c0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
293d0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
293e0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
293f0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29400 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
29410 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29430 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
29440 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29450 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
29460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29470 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29480 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
29490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
294a0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
294b0 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
294c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
294d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
294e0 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
294f0 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68  rvedLock, /* xCh
29500 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29510 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
29520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29530 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
29540 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69   method */.)..#i
29550 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29560 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
29570 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d   !OS_VXWORKS.IOM
29580 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49  ETHODS(.  flockI
29590 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
295a0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
295b0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
295c0 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c   flockIoMethods,
295d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
295e0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
295f0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29600 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
29610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29620 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
29630 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c  disabled */.  fl
29640 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
29650 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29660 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  e method */.  fl
29670 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
29680 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29690 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
296a0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
296b0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
296c0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
296d0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
296e0 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63  Lock,   /* xChec
296f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29700 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
29710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29720 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
29730 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
29740 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f..#if OS_VXWORK
29750 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73  S.IOMETHODS(.  s
29760 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  emIoFinder,     
29770 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
29780 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29790 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f   */.  semIoMetho
297a0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
297b0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
297c0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
297d0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297f0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29800 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29810 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20  .  semClose,    
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29830 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29840 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20  .  semLock,     
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29860 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
29870 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20    semUnlock,    
29880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29890 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
298a0 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  .  semCheckReser
298b0 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  vedLock,     /* 
298c0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
298d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
29900 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
29910 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
29920 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29930 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
29940 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
29950 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
29960 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
29970 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29980 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
29990 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
299a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
299b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
299c0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
299d0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
299f0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
29a00 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
29a10 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fpClose,        
29a20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29a30 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  se method */.  a
29a40 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  fpLock,         
29a50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29a60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
29a70 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  pUnlock,        
29a80 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29a90 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
29aa0 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
29ab0 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65  ock,     /* xChe
29ac0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29ad0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29af0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
29b00 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
29b10 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  if../*.** The pr
29b20 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  oxy locking meth
29b30 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d  od is a "super-m
29b40 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65  ethod" in the se
29b50 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f  nse that it.** o
29b60 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66  pens secondary f
29b70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
29b80 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e  for the conch an
29b90 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64  d lock files and
29ba0 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78  .** it uses prox
29bb0 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50  y, dot-file, AFP
29bc0 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f  , and flock() lo
29bd0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
29be0 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64   those.** second
29bf0 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20  ary files.  For 
29c00 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
29c10 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
29c20 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f  mplements.** pro
29c30 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f  xy locking is lo
29c40 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68  cated much furth
29c50 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66  er down in the f
29c60 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ile.  But we nee
29c70 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  d.** to go ahead
29c80 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20   and define the 
29c90 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29ca0 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75  ds and finder fu
29cb0 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72  nction.** for pr
29cc0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65  oxy locking here
29cd0 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64  .  So we forward
29ce0 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f   declare the I/O
29cf0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66   methods..*/.#if
29d00 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
29d10 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
29d20 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29d30 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  LE.static int pr
29d40 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
29d50 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
29d60 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71  int proxyLock(sq
29d70 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
29d80 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
29d90 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
29da0 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
29db0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
29dc0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29dd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
29de0 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53  int*);.IOMETHODS
29df0 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65  (.  proxyIoFinde
29e00 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
29e10 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
29e20 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
29e30 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
29e40 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
29e50 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
29e60 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e80 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
29e90 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
29ea0 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f  ed */.  proxyClo
29eb0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
29ec0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
29ed0 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63  od */.  proxyLoc
29ee0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29ef0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
29f00 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f  d */.  proxyUnlo
29f10 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29f20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
29f30 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65  od */.  proxyChe
29f40 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
29f50 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
29f60 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
29f70 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f90 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
29fa0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  */.).#endif../* 
29fb0 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58  nfs lockd on OSX
29fc0 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63   10.3+ doesn't c
29fd0 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73  lear write locks
29fe0 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
29ff0 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20  k is set */.#if 
2a000 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2a010 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2a020 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2a030 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  E.IOMETHODS(.  n
2a040 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fsIoFinder,     
2a050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2a060 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2a070 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68  e */.  nfsIoMeth
2a080 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
2a090 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2a0a0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2a0b0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2a0e0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2a0f0 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a110 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2a120 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a140 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2a150 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b  d */.  nfsUnlock
2a160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a170 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2a180 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
2a190 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
2a1a0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
2a1b0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
2a1c0 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1e0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2a1f0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2a200 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2a210 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2a220 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a230 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
2a240 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
2a250 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
2a260 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
2a270 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
2a280 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
2a290 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
2a2a0 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
2a2b0 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
2a2c0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a2d0 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
2a2e0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
2a2f0 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
2a300 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63   This is for Mac
2a310 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  OSX only..*/.sta
2a320 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2a330 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
2a340 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2a350 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
2a360 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
2a370 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
2a380 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2a390 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
2a3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65            /* ope
2a3b0 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f  n file object fo
2a3c0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2a3d0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ile */.){.  stat
2a3e0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2a3f0 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f  Mapping {.    co
2a400 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73  nst char *zFiles
2a410 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20  ystem;          
2a420 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65      /* Filesyste
2a430 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20  m type name */. 
2a440 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
2a450 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
2a460 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72  thods;   /* Appr
2a470 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
2a480 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d  method */.  } aM
2a490 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ap[] = {.    { "
2a4a0 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  hfs",    &posixI
2a4b0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2a4c0 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73  { "ufs",    &pos
2a4d0 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2a4e0 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26     { "afpfs",  &
2a4f0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
2a500 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
2a510 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
2a520 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
2a530 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2a540 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
2a550 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
2a560 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
2a570 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
2a580 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
2a590 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
2a5a0 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
2a5b0 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
2a5c0 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
2a5d0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
2a5e0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
2a5f0 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
2a600 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
2a610 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
2a620 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
2a630 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
2a640 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
2a650 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
2a660 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
2a670 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
2a680 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
2a690 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2a6a0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
2a6b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
2a6c0 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
2a6d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2a6e0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
2a6f0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
2a700 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
2a710 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2a720 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
2a730 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
2a740 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2a750 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
2a760 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
2a770 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
2a780 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
2a790 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
2a7a0 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
2a7b0 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
2a7c0 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
2a7d0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2a7e0 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
2a7f0 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
2a800 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
2a810 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
2a820 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
2a830 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
2a840 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
2a850 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
2a860 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
2a870 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
2a880 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
2a890 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
2a8a0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
2a8b0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2a8c0 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b  me, "nfs")==0 ){
2a8d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
2a8e0 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  fsIoMethods;.   
2a8f0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2a900 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
2a910 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
2a920 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2a930 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  n &dotlockIoMeth
2a940 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
2a950 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a960 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
2a970 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
2a980 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2a990 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2a9a0 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
2a9b0 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
2a9c0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
2a9d0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2a9e0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a9f0 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f  TYLE */..#if OS_
2aa00 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54  VXWORKS && SQLIT
2aa10 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2aa20 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
2aa30 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
2aa40 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
2aa50 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
2aa60 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
2aa70 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
2aa80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
2aa90 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
2aaa0 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
2aab0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2aac0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
2aad0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
2aae0 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
2aaf0 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56 58  * This is for VX
2ab00 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  Works only..*/.s
2ab10 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2ab20 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2ab30 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2ab40 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
2ab50 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
2ab60 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
2ab70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2ab80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2ab90 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
2aba0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
2abb0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
2abc0 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
2abd0 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
2abe0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
2abf0 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
2ac00 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
2ac10 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2ac20 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
2ac30 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
2ac40 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2ac50 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
2ac60 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2ac70 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
2ac80 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
2ac90 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
2aca0 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
2acb0 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
2acc0 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
2acd0 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
2ace0 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
2acf0 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
2ad00 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2ad10 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2ad20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2ad30 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2ad40 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2ad50 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2ad60 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2ad70 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2ad80 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2ad90 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
2ada0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
2adb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2adc0 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
2add0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2ade0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2adf0 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2ae00 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
2ae10 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
2ae20 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
2ae30 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2ae40 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2ae50 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
2ae60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2ae70 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
2ae80 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
2ae90 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
2aea0 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65  nter to an IO me
2aeb0 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
2aec0 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66  tion:.*/.typedef
2aed0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2aee0 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e  o_methods *(*fin
2aef0 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20  der_type)(const 
2af00 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2af10 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
2af20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2af70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
2af80 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
2af90 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
2afa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2afb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
2afc0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
2afd0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2afe0 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
2aff0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
2b000 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
2b010 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
2b020 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2b030 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
2b040 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
2b050 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69  by pId..*/.stati
2b060 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78  c int fillInUnix
2b070 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  File(.  sqlite3_
2b080 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2b090 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
2b0a0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  s object */.  in
2b0b0 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
2b0c0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
2b0d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
2b0e0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
2b0f0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
2b100 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
2b110 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
2b120 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2b130 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2b140 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2b150 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
2b160 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
2b170 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  pened */.  int c
2b180 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
2b190 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
2b1a0 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61  re UNIXFILE_* va
2b1b0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  lues */.){.  con
2b1c0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2b1d0 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53  thods *pLockingS
2b1e0 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65  tyle;.  unixFile
2b1f0 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
2b200 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
2b210 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b220 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
2b230 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b  >pInode==NULL );
2b240 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74  ..  /* Usually t
2b250 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d  he path zFilenam
2b260 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
2b270 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
2b280 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78  ame. The.  ** ex
2b290 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
2b2a0 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78  opening the prox
2b2b0 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69  y "conch" file i
2b2c0 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20  n builds that.  
2b2d0 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73  ** include the s
2b2e0 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63  pecial Apple loc
2b2f0 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a  king styles..  *
2b300 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
2b310 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2b320 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b330 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74  G_STYLE.  assert
2b340 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
2b350 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
2b360 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73  '/' .    || pVfs
2b370 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69  ->pAppData==(voi
2b380 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
2b390 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20  nder );.#else.  
2b3a0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2b3b0 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
2b3c0 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e  e[0]=='/' );.#en
2b3d0 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63  dif..  /* No loc
2b3e0 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74  king occurs in t
2b3f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
2b400 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  /.  assert( zFil
2b410 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72  ename!=0 || (ctr
2b420 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2b430 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a  E_NOLOCK)!=0 );.
2b440 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
2b450 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
2b460 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
2b470 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
2b480 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70    pNew->pVfs = p
2b490 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61  Vfs;.  pNew->zPa
2b4a0 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2b4b0 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2b4c0 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67  s = (u8)ctrlFlag
2b4d0 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  s;.#if SQLITE_MA
2b4e0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
2b4f0 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  pNew->mmapSizeMa
2b500 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  x = sqlite3Globa
2b510 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
2b520 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
2b530 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2b540 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  (((ctrlFlags & U
2b550 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a  NIXFILE_URI) ? z
2b560 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20  Filename : 0),. 
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b580 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22            "psow"
2b590 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
2b5a0 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
2b5b0 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2b5c0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2b5d0 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  _PSOW;.  }.  if(
2b5e0 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e   strcmp(pVfs->zN
2b5f0 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29  ame,"unix-excl")
2b600 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ==0 ){.    pNew-
2b610 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2b620 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d  IXFILE_EXCL;.  }
2b630 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
2b640 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76  .  pNew->pId = v
2b650 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
2b660 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
2b670 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20  f( pNew->pId==0 
2b680 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73  ){.    ctrlFlags
2b690 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
2b6a0 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  OCK;.    rc = SQ
2b6b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2b6c0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74  #endif..  if( ct
2b6d0 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
2b6e0 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20  LE_NOLOCK ){.   
2b6f0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b700 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2b710 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
2b720 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2b730 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a  (**(finder_type*
2b740 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29  )pVfs->pAppData)
2b750 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  (zFilename, pNew
2b760 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
2b770 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b780 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20  LE.    /* Cache 
2b790 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65  zFilename in the
2b7a0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
2b7b0 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63   (AFP and dotloc
2b7c0 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a  k override) for.
2b7d0 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b      ** proxyLock
2b7e0 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70   activation is p
2b7f0 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20  ossible (remote 
2b800 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f  proxy is based o
2b810 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a  n db name).    *
2b820 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61  * zFilename rema
2b830 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
2b840 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20  file is closed, 
2b850 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20  to support */.  
2b860 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
2b870 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29  ontext = (void*)
2b880 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69  zFilename;.#endi
2b890 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f  f.  }..  if( pLo
2b8a0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70  ckingStyle == &p
2b8b0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69  osixIoMethods.#i
2b8c0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2b8d0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2b8e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2b8f0 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b  YLE.    || pLock
2b900 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73  ingStyle == &nfs
2b910 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66  IoMethods.#endif
2b920 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  .  ){.    unixEn
2b930 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2b940 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2b950 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2b960 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
2b970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b980 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e  {.      /* If an
2b990 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2b9a0 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  in findInodeInfo
2b9b0 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
2b9c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
2b9d0 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
2b9e0 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
2b9f0 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
2ba00 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
2ba10 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a  may fail.      *
2ba20 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  * in two scenari
2ba30 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  os:.      **.   
2ba40 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61     **   (a) A ca
2ba50 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61  ll to fstat() fa
2ba60 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20  iled..      **  
2ba70 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61   (b) A malloc fa
2ba80 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  iled..      **. 
2ba90 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f       ** Scenario
2baa0 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63   (b) may only oc
2bab0 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65  cur if the proce
2bac0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f  ss is holding no
2bad0 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
2bae0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2baf0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2bb00 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
2bb10 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65   were other file
2bb20 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
2bb30 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69  ptors on this fi
2bb40 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c  le, then no mall
2bb50 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  oc would be requ
2bb60 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2bb70 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2bb80 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
2bb90 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
2bba0 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
2bbb0 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
2bbc0 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
2bbd0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
2bbe0 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
2bbf0 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
2bc00 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
2bc10 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
2bc20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
2bc30 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
2bc40 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
2bc50 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
2bc60 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
2bc70 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
2bc80 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
2bc90 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
2bca0 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
2bcb0 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
2bcc0 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
2bcd0 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
2bce0 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
2bcf0 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
2bd00 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
2bd10 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2bd20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2bd30 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   h = -1;.    }. 
2bd40 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2bd50 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  x();.  }..#if SQ
2bd60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2bd70 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
2bd80 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
2bd90 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2bda0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70  ingStyle == &afp
2bdb0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2bdc0 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20   /* AFP locking 
2bdd0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2bde0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2bdf0 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
2be00 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c  .    ** the afpL
2be10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20  ockingContext.. 
2be20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63     */.    afpLoc
2be30 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
2be40 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  x;.    pNew->loc
2be50 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
2be60 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
2be70 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
2be80 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
2be90 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
2bea0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2beb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bec0 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
2bed0 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
2bee0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2bef0 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
2bf00 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
2bf10 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
2bf20 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
2bf30 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
2bf40 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
2bf50 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
2bf60 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
2bf70 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
2bf80 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2bf90 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
2bfa0 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
2bfb0 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
2bfc0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2bfd0 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
2bfe0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2bff0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2c000 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2c010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c030 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
2c040 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
2c050 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2c060 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2c070 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
2c080 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
2c090 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2c0a0 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
2c0b0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2c0c0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2c0d0 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
2c0e0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
2c0f0 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
2c100 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2c110 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2c120 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2c130 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2c140 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
2c150 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
2c160 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
2c170 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
2c180 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65  lename;.    asse
2c190 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
2c1a0 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d   );.    nFilenam
2c1b0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
2c1c0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
2c1d0 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
2c1e0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2c1f0 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
2c200 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
2c210 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2c220 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c230 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
2c240 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2c250 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
2c260 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
2c270 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
2c280 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2c290 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
2c2a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
2c2b0 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
2c2c0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
2c2d0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2c2e0 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
2c2f0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2c300 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
2c310 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2c320 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2c330 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
2c340 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
2c350 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
2c360 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
2c370 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2c380 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
2c390 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2c3a0 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2c3b0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
2c3c0 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
2c3d0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
2c3e0 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
2c3f0 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
2c400 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
2c410 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
2c420 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
2c430 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
2c440 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
2c450 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c470 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
2c480 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
2c490 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
2c4a0 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
2c4b0 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
2c4c0 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
2c4d0 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
2c4e0 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
2c4f0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2c500 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
2c510 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
2c520 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
2c530 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
2c540 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
2c550 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
2c560 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2c570 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2c580 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
2c590 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
2c5a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
2c5b0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2c5c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2c5d0 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  pNew->lastErrno 
2c5e0 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  = 0;.#if OS_VXWO
2c5f0 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
2c600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2c610 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
2c620 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2c630 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68  __LINE__);.    h
2c640 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c   = -1;.    osUnl
2c650 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
2c660 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2c670 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2c680 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64  DELETE;.  }.#end
2c690 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
2c6a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2c6b0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2c6c0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2c6d0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
2c6e0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
2c6f0 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
2c700 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
2c710 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76  unter(+1);.    v
2c720 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77  erifyDbFile(pNew
2c730 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2c740 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2c750 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
2c760 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
2c770 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
2c780 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
2c790 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
2c7a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
2c7b0 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
2c7c0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
2c7d0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
2c7e0 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
2c7f0 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
2c800 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2c810 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
2c820 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
2c830 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
2c840 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
2c850 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
2c860 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
2c870 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
2c880 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
2c890 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2c8a0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2c8b0 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
2c8c0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
2c8d0 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
2c8e0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2c8f0 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
2c900 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
2c910 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  1] = getenv("SQL
2c920 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20  ITE_TMPDIR");.  
2c930 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29  if( !azDirs[2] )
2c940 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74   azDirs[2] = get
2c950 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
2c960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2c970 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
2c980 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
2c990 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
2c9a0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
2c9b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c9c0 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
2c9d0 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
2c9e0 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
2c9f0 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
2ca00 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2ca10 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
2ca20 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
2ca30 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
2ca40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
2ca50 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
2ca60 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
2ca70 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
2ca80 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
2ca90 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
2caa0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
2cab0 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
2cac0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
2cad0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
2cae0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2caf0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
2cb00 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
2cb10 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
2cb20 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
2cb30 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
2cb40 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
2cb50 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
2cb60 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
2cb70 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
2cb80 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
2cb90 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
2cba0 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e  56789";.  unsign
2cbb0 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  ed int i, j;.  c
2cbc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2cbd0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
2cbe0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
2cbf0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
2cc00 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
2cc10 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
2cc20 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
2cc30 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
2cc40 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
2cc50 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
2cc60 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
2cc70 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
2cc80 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2cc90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2cca0 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75  R );..  zDir = u
2ccb0 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
2ccc0 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20  ;.  if( zDir==0 
2ccd0 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20  ) zDir = ".";.. 
2cce0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2ccf0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
2cd00 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
2cd10 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
2cd20 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
2cd30 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
2cd40 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2cd50 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
2cd60 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
2cd70 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
2cd80 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2cd90 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65  ) + 18) >= (size
2cda0 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
2cdb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2cdc0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
2cdd0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2cde0 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75  ntf(nBuf-18, zBu
2cdf0 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
2ce00 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
2ce10 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
2ce20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
2ce30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2ce40 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
2ce50 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
2ce60 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
2ce70 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
2ce80 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
2ce90 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
2cea0 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
2ceb0 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
2cec0 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
2ced0 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a  uf[j] = 0;.    z
2cee0 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20  Buf[j+1] = 0;.  
2cef0 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73  }while( osAccess
2cf00 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
2cf10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cf20 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
2cf30 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2cf40 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2cf50 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
2cf60 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
2cf70 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
2cf80 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
2cf90 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
2cfa0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2cfb0 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
2cfc0 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
2cfd0 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
2cfe0 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
2cff0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2d000 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
2d010 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2d020 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
2d030 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
2d040 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
2d050 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
2d060 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
2d070 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2d080 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
2d090 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
2d0a0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
2d0b0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
2d0c0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
2d0d0 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
2d0e0 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
2d0f0 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
2d100 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
2d110 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
2d120 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2d130 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
2d140 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2d150 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
2d160 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
2d170 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
2d180 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2d190 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
2d1a0 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
2d1b0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2d1c0 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
2d1d0 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
2d1e0 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
2d1f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
2d200 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2d210 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
2d220 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
2d230 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
2d240 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
2d250 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
2d260 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
2d270 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
2d280 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
2d290 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
2d2a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
2d2b0 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
2d2c0 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
2d2d0 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
2d2e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
2d2f0 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
2d300 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
2d310 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
2d320 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
2d330 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
2d340 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
2d350 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
2d360 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
2d370 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
2d380 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
2d390 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
2d3a0 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
2d3b0 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
2d3c0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
2d3d0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2d3e0 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2d3f0 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
2d400 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
2d410 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
2d420 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
2d430 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
2d440 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
2d450 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
2d460 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
2d470 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
2d480 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
2d490 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
2d4a0 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
2d4b0 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
2d4c0 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
2d4d0 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
2d4e0 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
2d4f0 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
2d500 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
2d510 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2d520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d530 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
2d540 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
2d550 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
2d560 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
2d570 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
2d580 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
2d590 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
2d5a0 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
2d5b0 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
2d5c0 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
2d5d0 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
2d5e0 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
2d5f0 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
2d600 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
2d610 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
2d620 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
2d630 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
2d640 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
2d650 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
2d660 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
2d670 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
2d680 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
2d690 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
2d6a0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
2d6b0 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
2d6c0 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
2d6d0 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
2d6e0 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
2d6f0 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
2d700 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
2d710 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
2d720 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65  reusable file de
2d730 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74  scriptor are not
2d740 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   dire.  */.  if(
2d750 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2d760 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2d770 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
2d780 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69  pInode;..    uni
2d790 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2d7a0 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
2d7b0 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
2d7c0 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
2d7d0 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
2d7e0 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d800 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
2d810 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e  leId.ino!=sStat.
2d820 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20  st_ino) ){.     
2d830 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
2d840 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  e->pNext;.    }.
2d850 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29      if( pInode )
2d860 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
2d870 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
2d880 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d   for(pp=&pInode-
2d890 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26  >pUnused; *pp &&
2d8a0 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66   (*pp)->flags!=f
2d8b0 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29  lags; pp=&((*pp)
2d8c0 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
2d8d0 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a   pUnused = *pp;.
2d8e0 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65        if( pUnuse
2d8f0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  d ){.        *pp
2d900 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78   = pUnused->pNex
2d910 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2d920 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2d930 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
2d940 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
2d950 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
2d960 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
2d970 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d980 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
2d990 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65  unixOpen() to de
2d9a0 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
2d9b0 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
2d9c0 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69  to create new fi
2d9d0 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20  les with. If no 
2d9e0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2d9f0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
2da00 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
2da10 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65  a value suitable
2da20 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20   for passing as 
2da30 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
2da40 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73  nt to open(2) is
2da50 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
2da60 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20  pMode. If an IO 
2da70 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
2da80 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2da90 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
2daa0 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2dab0 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f   of *pMode is no
2dac0 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  t modified..**.*
2dad0 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c  * In most cases,
2dae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
2daf0 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20  ts *pMode to 0, 
2db00 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d  which will becom
2db10 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69  e.** an indicati
2db20 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65  on to robust_ope
2db30 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68  n() to create th
2db40 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20  e file using.** 
2db50 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2db60 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
2db70 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20  adjusted by the 
2db80 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66  umask..** But if
2db90 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2dba0 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
2dbb0 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
2dbc0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
2dbd0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2dbe0 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
2dbf0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2dc00 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
2dc10 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
2dc20 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
2dc30 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
2dc40 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
2dc50 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
2dc60 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
2dc70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
2dc80 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
2dc90 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
2dca0 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
2dcb0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
2dcc0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2dcd0 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
2dce0 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
2dcf0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2dd00 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
2dd10 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
2dd20 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
2dd30 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
2dd40 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
2dd50 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
2dd60 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
2dd70 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
2dd80 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
2dd90 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
2dda0 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
2ddb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2ddc0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2ddd0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2dde0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2ddf0 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2de00 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
2de10 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
2de20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de40 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
2de50 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
2de60 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
2de70 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
2de80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2de90 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
2dea0 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
2deb0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69  ile with */.  ui
2dec0 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20  d_t *pUid,      
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dee0 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74   OUT: uid to set
2def0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2df00 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
2df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f    /* OUT: gid to
2df30 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2df40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2df50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2df60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2df70 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
2df80 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64  ode = 0;.  *pUid
2df90 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20   = 0;.  *pGid = 
2dfa0 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  0;.  if( flags &
2dfb0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
2dfc0 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
2dfd0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
2dfe0 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f     char zDb[MAX_
2dff0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20  PATHNAME+1];    
2e000 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
2e010 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
2e020 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20  t nDb;          
2e030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e040 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62  umber of valid b
2e050 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20  ytes in zDb */. 
2e060 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
2e070 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2e080 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74   /* Output of st
2e090 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65  at() on database
2e0a0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
2e0b0 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68   zPath is a path
2e0c0 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75   to a WAL or jou
2e0d0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66  rnal file. The f
2e0e0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64  ollowing block d
2e0f0 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68  erives.    ** th
2e100 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73  e path to the as
2e110 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
2e120 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74  e file from zPat
2e130 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  h. This block ha
2e140 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  ndles.    ** the
2e150 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e   following namin
2e160 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20  g conventions:. 
2e170 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22     **.    **   "
2e180 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2e190 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  rnal".    **   "
2e1a0 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
2e1b0 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2e1c0 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
2e1d0 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  NN".    **   "<p
2e1e0 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e  ath to db>-walNN
2e1f0 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
2e200 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65  where NN is a de
2e210 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68  cimal number. Th
2e220 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65  e NN naming sche
2e230 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  mes are .    ** 
2e240 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
2e250 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64  _multiplex.c mod
2e260 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ule..    */.    
2e270 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nDb = sqlite3Str
2e280 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31  len30(zPath) - 1
2e290 3b 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ; .#ifdef SQLITE
2e2a0 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
2e2b0 53 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62  S.    while( nDb
2e2c0 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 61  >0 && sqlite3Isa
2e2d0 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29  lnum(zPath[nDb])
2e2e0 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66   ) nDb--;.    if
2e2f0 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74  ( nDb==0 || zPat
2e300 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65  h[nDb]!='-' ) re
2e310 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e320 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
2e330 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
2e340 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e350 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20  ( nDb>0 );.     
2e360 20 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e   assert( zPath[n
2e370 44 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20  Db]!='\n' );.   
2e380 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a     nDb--;.    }.
2e390 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70  #endif.    memcp
2e3a0 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
2e3b0 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
2e3c0 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66   = '\0';..    if
2e3d0 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c  ( 0==osStat(zDb,
2e3e0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2e3f0 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74    *pMode = sStat
2e400 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b  .st_mode & 0777;
2e410 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73  .      *pUid = s
2e420 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20  Stat.st_uid;.   
2e430 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74     *pGid = sStat
2e440 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c  .st_gid;.    }el
2e450 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2e460 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
2e470 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  T;.    }.  }else
2e480 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2e490 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2e4a0 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70  NCLOSE ){.    *p
2e4b0 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d  Mode = 0600;.  }
2e4c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e4d0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
2e4e0 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
2e4f0 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
2e500 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
2e510 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
2e520 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
2e530 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
2e540 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
2e550 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
2e560 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
2e570 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
2e580 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
2e590 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
2e5a0 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
2e5b0 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
2e5c0 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
2e5d0 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
2e5e0 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
2e5f0 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
2e600 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
2e610 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
2e620 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
2e630 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
2e640 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
2e650 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
2e660 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2e670 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
2e680 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
2e690 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
2e6a0 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
2e6b0 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
2e6c0 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
2e6d0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
2e6e0 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
2e6f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
2e700 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
2e710 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
2e720 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
2e730 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
2e740 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
2e750 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
2e760 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
2e770 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
2e780 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
2e790 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
2e7a0 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
2e7b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
2e7c0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2e7d0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
2e7e0 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72    /* The VFS for
2e7f0 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74   which this is t
2e800 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20  he xOpen method 
2e810 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2e820 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2e830 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66    /* Pathname of
2e840 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e   file to be open
2e850 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
2e860 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  file *pFile,    
2e870 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
2e880 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
2e890 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20  e filled in */. 
2e8a0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e8c0 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20   Input flags to 
2e8d0 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e  control the open
2e8e0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ing */.  int *pO
2e8f0 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
2e900 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2e910 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74  flags returned t
2e920 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  o SQLite core */
2e930 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
2e940 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  p = (unixFile *)
2e950 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20  pFile;.  int fd 
2e960 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
2e970 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2e980 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
2e990 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
2e9a0 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
2e9b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e9c0 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
2e9d0 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
2e9e0 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
2e9f0 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
2ea00 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
2ea10 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2ea20 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ea40 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
2ea50 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
2ea60 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2ea70 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2ea80 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2ea90 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2eaa0 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d   int ctrlFlags =
2eab0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2eac0 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c  /* UNIXFILE_* fl
2ead0 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ags */..  int is
2eae0 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
2eaf0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2eb00 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
2eb10 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
2eb20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2eb30 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2eb40 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
2eb50 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
2eb60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2eb70 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
2eb80 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
2eb90 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2eba0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2ebb0 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
2ebc0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
2ebd0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2ebe0 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
2ebf0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2ec00 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
2ec10 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
2ec20 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2ec30 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
2ec40 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
2ec50 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2ec60 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ec70 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
2ec80 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
2ec90 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2eca0 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
2ecb0 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
2ecc0 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
2ecd0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
2ece0 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
2ecf0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
2ed00 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
2ed10 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
2ed20 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
2ed30 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
2ed40 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
2ed50 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
2ed60 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
2ed70 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
2ed80 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65  syncDir = (isCre
2ed90 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
2eda0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2edb0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2edc0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2edd0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2ede0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
2edf0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2ee00 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
2ee10 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
2ee20 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
2ee30 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
2ee40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
2ee50 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
2ee60 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
2ee70 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
2ee80 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
2ee90 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
2eea0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
2eeb0 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
2eec0 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+2];.  const c
2eed0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
2eee0 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
2eef0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2ef00 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
2ef10 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
2ef20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
2ef30 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
2ef40 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
2ef50 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
2ef60 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
2ef70 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
2ef80 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
2ef90 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2efa0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
2efb0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
2efc0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
2efd0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
2efe0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
2eff0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
2f000 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
2f010 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
2f020 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
2f030 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
2f040 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
2f050 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
2f060 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
2f070 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
2f080 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
2f090 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
2f0a0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
2f0b0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
2f0c0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2f0d0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
2f0e0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
2f0f0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
2f100 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
2f110 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
2f120 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
2f130 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2f140 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
2f150 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
2f160 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
2f170 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
2f180 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f190 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f1a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2f1b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2f1c0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f1d0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f1e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f1f0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2f200 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2f210 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2f220 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2f230 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
2f240 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2f250 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2f260 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2f270 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
2f280 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
2f290 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
2f2a0 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
2f2b0 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
2f2c0 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
2f2d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f2e0 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
2f2f0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f300 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
2f310 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2f320 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f330 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
2f340 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2f350 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
2f360 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f370 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
2f380 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
2f390 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2f3a0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2f3b0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f3c0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
2f3d0 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
2f3e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2f3f0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  .  );..  /* Dete
2f400 63 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20  ct a pid change 
2f410 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 52  and reset the PR
2f420 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  NG.  There is a 
2f430 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  race condition. 
2f440 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74 68   ** here such th
2f450 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  at two or more t
2f460 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e  hreads all tryin
2f470 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  g to open databa
2f480 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ses at.  ** the 
2f490 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67  same instant mig
2f4a0 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65  ht all reset the
2f4b0 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74   PRNG.  But mult
2f4c0 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a  iple resets.  **
2f4d0 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20   are harmless.. 
2f4e0 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d   */.  if( random
2f4f0 6e 65 73 73 50 69 64 21 3d 67 65 74 70 69 64 28  nessPid!=getpid(
2f500 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e  ) ){.    randomn
2f510 65 73 73 50 69 64 20 3d 20 67 65 74 70 69 64 28  essPid = getpid(
2f520 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2f530 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
2f540 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c    }..  memset(p,
2f550 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
2f560 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54  ile));..  if( eT
2f570 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f580 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
2f590 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2f5a0 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73  nused;.    pUnus
2f5b0 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c  ed = findReusabl
2f5c0 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  eFd(zName, flags
2f5d0 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73  );.    if( pUnus
2f5e0 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d  ed ){.      fd =
2f5f0 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
2f600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2f610 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
2f620 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
2f630 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20  pUnused));.     
2f640 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
2f650 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f660 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2f670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2f680 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e  p->pUnused = pUn
2f690 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61  used;..    /* Da
2f6a0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
2f6b0 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
2f6c0 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
2f6d0 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  hey are not.    
2f6e0 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72  ** URIs with par
2f6f0 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  ameters.  Hence,
2f700 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73   they can always
2f710 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a   be passed into.
2f720 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75      ** sqlite3_u
2f730 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20  ri_parameter(). 
2f740 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
2f750 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2f760 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d  PEN_URI) || zNam
2f770 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  e[strlen(zName)+
2f780 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73  1]==0 );..  }els
2f790 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a  e if( !zName ){.
2f7a0 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
2f7b0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70  is NULL, the upp
2f7c0 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75  er layer is requ
2f7d0 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69  esting a temp fi
2f7e0 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
2f7f0 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 73  t(isDelete && !s
2f800 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20  yncDir);.    rc 
2f810 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  = unixGetTempnam
2f820 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e(MAX_PATHNAME+2
2f830 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
2f840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2f860 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2f870 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
2f880 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  e;..    /* Gener
2f890 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  ated temporary f
2f8a0 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77  ilenames are alw
2f8b0 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  ays double-zero 
2f8c0 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a  terminated.    *
2f8d0 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c  * for use by sql
2f8e0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
2f8f0 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73  er(). */.    ass
2f900 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65  ert( zName[strle
2f910 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  n(zName)+1]==0 )
2f920 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
2f930 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
2f940 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  of the flags par
2f950 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
2f960 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a   POSIX function.
2f970 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65    ** open(). The
2f980 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75  se must be calcu
2f990 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70  lated even if op
2f9a0 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  en() is not call
2f9b0 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79  ed, as.  ** they
2f9c0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2f9d0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  s part of the fi
2f9e0 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73  le handle and us
2f9f0 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20  ed by the .  ** 
2fa00 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63  'conch file' loc
2fa10 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c  king functions l
2fa20 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ater on.  */.  i
2fa30 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
2fa40 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2fa50 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
2fa60 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e  ReadWrite ) open
2fa70 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b  Flags |= O_RDWR;
2fa80 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
2fa90 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  )    openFlags |
2faa0 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
2fab0 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
2fac0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45  penFlags |= (O_E
2fad0 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b  XCL|O_NOFOLLOW);
2fae0 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  .  openFlags |= 
2faf0 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
2fb00 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66  INARY);..  if( f
2fb10 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
2fb20 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
2fb30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
2fb40 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
2fb50 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
2fb60 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20     uid_t uid;   
2fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb80 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74   /* Userid for t
2fb90 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67  he file */.    g
2fba0 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20  id_t gid;       
2fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fbc0 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20  Groupid for the 
2fbd0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  file */.    rc =
2fbe0 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
2fbf0 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  ode(zName, flags
2fc00 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69  , &openMode, &ui
2fc10 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66  d, &gid);.    if
2fc20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fc30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2fc40 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a   !p->pUnused );.
2fc50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
2fc60 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2fc70 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  _WAL || eType==S
2fc80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2fc90 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20  JOURNAL );.     
2fca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2fcb0 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  }.    fd = robus
2fcc0 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
2fcd0 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
2fce0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
2fcf0 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25  ("OPENX   %-3d %
2fd00 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e  s 0%o\n", fd, zN
2fd10 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29  ame, openFlags))
2fd20 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26  ;.    if( fd<0 &
2fd30 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20  & errno!=EISDIR 
2fd40 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26  && isReadWrite &
2fd50 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
2fd60 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65  {.      /* Faile
2fd70 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
2fd80 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
2fd90 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
2fda0 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
2fdb0 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
2fdc0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2fdd0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
2fde0 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70  REATE);.      op
2fdf0 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52  enFlags &= ~(O_R
2fe00 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20  DWR|O_CREAT);.  
2fe10 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
2fe20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2fe30 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  Y;.      openFla
2fe40 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
2fe50 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
2fe60 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d   = 1;.      fd =
2fe70 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
2fe80 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
2fe90 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  penMode);.    }.
2fea0 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
2feb0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
2fec0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2fed0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
2fee0 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  pen", zName);.  
2fef0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2ff00 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  nished;.    }.. 
2ff10 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
2ff20 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
2ff30 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20   as root and if 
2ff40 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72  creating a new r
2ff50 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
2ff60 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69  ournal or WAL fi
2ff70 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65  le, set the owne
2ff80 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75  rship of the jou
2ff90 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62  rnal or WAL to b
2ffa0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
2ffb0 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  e as the origina
2ffc0 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  l database..    
2ffd0 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  */.    if( flags
2ffe0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
2fff0 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
30000 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
30010 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28  .      osFchown(
30020 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20  fd, uid, gid);. 
30030 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
30040 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66  t( fd>=0 );.  if
30050 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
30060 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
30070 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
30080 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a  ( p->pUnused ){.
30090 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
300a0 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e  fd = fd;.    p->
300b0 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
300c0 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
300d0 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
300e0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
300f0 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
30100 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
30110 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54  QLITE_UNLINK_AFT
30120 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50  ER_CLOSE).    zP
30130 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ath = sqlite3_mp
30140 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d  rintf("%s", zNam
30150 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  e);.    if( zPat
30160 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h==0 ){.      ro
30170 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
30180 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
30190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
301a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65  _NOMEM;.    }.#e
301b0 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  lse.    osUnlink
301c0 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
301d0 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
301e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
301f0 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
30200 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
30210 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
30220 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
30230 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
30240 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
30250 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
30260 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
30270 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
30280 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74  _STYLE.  if( fst
30290 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f  atfs(fd, &fsInfo
302a0 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28  ) == -1 ){.    (
302b0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
302c0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
302d0 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74  rrno;.    robust
302e0 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
302f0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74  LINE__);.    ret
30300 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
30310 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69  _ACCESS;.  }.  i
30320 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
30330 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e  "msdos", fsInfo.
30340 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
30350 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
30360 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
30370 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
30380 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
30390 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
303a0 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72 69   Set up appropri
303b0 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f  ate ctrlFlags */
303c0 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
303d0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
303e0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
303f0 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
30400 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
30410 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  )              c
30420 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
30430 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  FILE_RDONLY;.  i
30440 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20  f( noLock )     
30450 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
30460 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
30470 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28  LE_NOLOCK;.  if(
30480 20 73 79 6e 63 44 69 72 20 29 20 20 20 20 20 20   syncDir )      
30490 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
304a0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
304b0 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20  _DIRSYNC;.  if( 
304c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
304d0 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c  PEN_URI ) ctrlFl
304e0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
304f0 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  URI;..#if SQLITE
30500 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
30510 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45  STYLE.#if SQLITE
30520 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
30530 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72  CKING.  isAutoPr
30540 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  oxy = 1;.#endif.
30550 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78    if( isAutoProx
30560 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c  y && (zPath!=NUL
30570 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20  L) && (!noLock) 
30580 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29  && pVfs->xOpen )
30590 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66  {.    char *envf
305a0 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53  orce = getenv("S
305b0 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
305c0 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20  Y_LOCKING");.   
305d0 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20   int useProxy = 
305e0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  0;..    /* SQLIT
305f0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
30600 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66  CKING==1 means f
30610 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20  orce always use 
30620 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a  proxy, 0 means .
30630 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65      ** never use
30640 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61   proxy, NULL mea
30650 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72  ns use proxy for
30660 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73   non-local files
30670 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69   only.  */.    i
30680 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c  f( envforce!=NUL
30690 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72  L ){.      usePr
306a0 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f  oxy = atoi(envfo
306b0 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73  rce)>0;.    }els
306c0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61  e{.      if( sta
306d0 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e  tfs(zPath, &fsIn
306e0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
306f0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
30700 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29  y, the close(fd)
30710 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74   call is sub-opt
30720 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c  imal. If the fil
30730 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20  e opened.       
30740 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61   ** with fd is a
30750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
30760 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74  and there are ot
30770 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
30780 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
30790 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
307a0 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
307b0 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79  holding advisory
307c0 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20   locks on it,.  
307d0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
307e0 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28  e call to close(
307f0 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68  ) will cancel th
30800 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72  ose locks. In pr
30810 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20  actice,.        
30820 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e  ** we're assumin
30830 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20  g that statfs() 
30840 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72  doesn't fail ver
30850 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73  y often. At leas
30860 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  t.        ** not
30870 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c   while other fil
30880 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
30890 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  ened by the same
308a0 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20   process on.    
308b0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
308c0 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  file are working
308d0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d  .  */.        p-
308e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
308f0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  no;.        robu
30900 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
30910 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
30920 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
30930 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
30940 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
30950 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
30960 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
30970 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
30980 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
30990 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
309a0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
309b0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
309c0 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
309d0 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
309e0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
309f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30a00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
30a10 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
30a20 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a  xFile((unixFile*
30a30 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22  )pFile, ":auto:"
30a40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
30a70 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c   unixClose to cl
30a80 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75  ean up the resou
30a90 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69  rces added in fi
30aa0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20  llInUnixFile .  
30ab0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
30ac0 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72  lear all the str
30ad0 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e  ucture's referen
30ae0 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ces.  Specifical
30af0 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ly, .          *
30b00 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  * pFile->pMethod
30b10 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73  s will be NULL s
30b20 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  o sqlite3OsClose
30b30 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
30b40 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20   .          */. 
30b50 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f           unixClo
30b60 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
30b70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b90 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  }.      goto ope
30ba0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
30bb0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
30bc0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
30bd0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
30be0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
30bf0 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f  rlFlags);..open_
30c00 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
30c10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30c20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
30c30 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  e(p->pUnused);. 
30c40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30c50 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  }.../*.** Delete
30c60 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61   the file at zPa
30c70 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79  th. If the dirSy
30c80 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nc argument is t
30c90 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20  rue, fsync().** 
30ca0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66  the directory af
30cb0 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ter deleting the
30cc0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
30cd0 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28   int unixDelete(
30ce0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
30cf0 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20  NotUsed,     /* 
30d00 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
30d10 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65  his as the xDele
30d20 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  te method */.  c
30d30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
30d40 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
30d50 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64   of file to be d
30d60 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
30d70 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20  dirSync         
30d80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
30d90 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74  , fsync() direct
30da0 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
30db0 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ng file */.){.  
30dc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30dd0 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  OK;.  UNUSED_PAR
30de0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
30df0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
30e00 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
30e10 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
30e20 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a    if( osUnlink(z
30e30 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  Path)==(-1) ){. 
30e40 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e     if( errno==EN
30e50 4f 45 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f  OENT.#if OS_VXWO
30e60 52 4b 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f  RKS.        || o
30e70 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29  sAccess(zPath,0)
30e80 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  !=0.#endif.    )
30e90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
30ea0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
30eb0 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73  _NOENT;.    }els
30ec0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  e{.      rc = un
30ed0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
30ee0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
30ef0 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29  "unlink", zPath)
30f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
30f10 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64  rn rc;.  }.#ifnd
30f20 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
30f30 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
30f40 28 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30  (dirSync & 1)!=0
30f50 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
30f60 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
30f70 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
30f80 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
30f90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
30fa0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
30fb0 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
30fc0 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20  )==-1 ).#else.  
30fd0 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
30fe0 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ) ).#endif.     
30ff0 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
31000 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
31010 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
31020 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50  YNC, "fsync", zP
31030 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
31040 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
31050 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
31060 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
31070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
31080 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
31090 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
310a0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
310b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
310c0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78  *.** Test the ex
310d0 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63  istence of or ac
310e0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
310f0 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20   of file zPath. 
31100 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66  The.** test perf
31110 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  ormed depends on
31120 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c   the value of fl
31130 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ags:.**.**     S
31140 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
31150 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66  STS: Return 1 if
31160 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
31170 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
31180 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
31190 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
311a0 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e   file is read an
311b0 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20  d writable..**  
311c0 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
311d0 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72  _READONLY: Retur
311e0 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
311f0 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a  is readable..**.
31200 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
31210 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
31220 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28   int unixAccess(
31230 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
31240 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68  NotUsed,   /* Th
31250 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  e VFS containing
31260 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65   this xAccess me
31270 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
31280 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
31290 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65    /* Path of the
312a0 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
312b0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
312d0 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74   What do we want
312e0 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20   to learn about 
312f0 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20  the zPath file? 
31300 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
31310 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
31320 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f  Write result boo
31330 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  lean here */.){.
31340 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b    int amode = 0;
31350 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
31360 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
31370 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
31380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
31390 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
313a0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
313b0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
313c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
313d0 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
313e0 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  F_OK;.      brea
313f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
31400 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
31410 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  ITE:.      amode
31420 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20   = W_OK|R_OK;.  
31430 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
31440 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
31450 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d  S_READ:.      am
31460 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20  ode = R_OK;.    
31470 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
31480 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
31490 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
314a0 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
314b0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
314c0 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68   (osAccess(zPath
314d0 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20  , amode)==0);.  
314e0 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54  if( flags==SQLIT
314f0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
31500 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20  && *pResOut ){. 
31510 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
31520 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  uf;.    if( 0==o
31530 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75  sStat(zPath, &bu
31540 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a  f) && buf.st_siz
31550 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==0 ){.      *p
31560 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  ResOut = 0;.    
31570 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
31580 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
31590 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
315a0 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
315b0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
315c0 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20  e. The relative 
315d0 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65  path.** is store
315e0 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  d as a nul-termi
315f0 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
31600 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
31610 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74  ed to by.** zPat
31620 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70  h. .**.** zOut p
31630 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
31640 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71  r of at least sq
31650 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
31660 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28  name bytes .** (
31670 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41  in this case, MA
31680 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73  X_PATHNAME bytes
31690 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68  ). The full-path
316a0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a   is written to.*
316b0 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65  * this buffer be
316c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
316d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
316e0 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  ixFullPathname(.
316f0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
31700 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
31710 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
31720 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
31730 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
31740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31750 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
31760 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
31770 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20   int nOut,      
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31790 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
317a0 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
317b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
317c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317d0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
317e0 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a  ffer */.){..  /*
317f0 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
31800 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
31810 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
31820 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
31830 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
31840 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
31850 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
31860 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
31870 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
31880 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
31890 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
318a0 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
318b0 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
318c0 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
318d0 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
318e0 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
318f0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
31900 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
31910 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
31920 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
31930 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50  xPathname==MAX_P
31940 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55  ATHNAME );.  UNU
31950 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
31960 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75  fs);..  zOut[nOu
31970 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69  t-1] = '\0';.  i
31980 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27  f( zPath[0]=='/'
31990 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
319a0 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a  snprintf(nOut, z
319b0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68  Out, "%s", zPath
319c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
319d0 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66  int nCwd;.    if
319e0 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c  ( osGetcwd(zOut,
319f0 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20   nOut-1)==0 ){. 
31a00 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
31a10 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
31a20 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
31a30 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b  getcwd", zPath);
31a40 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20  .    }.    nCwd 
31a50 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f  = (int)strlen(zO
31a60 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
31a70 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e  _snprintf(nOut-n
31a80 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d  Cwd, &zOut[nCwd]
31a90 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b  , "/%s", zPath);
31aa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
31ab0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
31ac0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31ad0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
31ae0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
31af0 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
31b00 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
31b10 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
31b20 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
31b30 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
31b40 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
31b50 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
31b60 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64  ..*/.#include <d
31b70 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76  lfcn.h>.static v
31b80 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28  oid *unixDlOpen(
31b90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
31ba0 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  Used, const char
31bb0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
31bc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31bd0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
31be0 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65  urn dlopen(zFile
31bf0 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c  name, RTLD_NOW |
31c00 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d   RTLD_GLOBAL);.}
31c10 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ../*.** SQLite c
31c20 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
31c30 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  on immediately a
31c40 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75  fter a call to u
31c50 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a  nixDlSym() or.**
31c60 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61   unixDlOpen() fa
31c70 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e  ils (returns a n
31c80 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66  ull pointer). If
31c90 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64   a more detailed
31ca0 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
31cb0 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
31cc0 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  it is written to
31cd0 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20   zBufOut. If no 
31ce0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
31cf0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a   is available, z
31d00 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75  BufOut is left u
31d10 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51  nmodified and SQ
31d20 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61  Lite uses a defa
31d30 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73  ult.** error mes
31d40 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
31d50 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72  void unixDlError
31d60 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
31d70 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
31d80 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
31d90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31da0 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Err;.  UNUSED_PA
31db0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31dc0 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
31dd0 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64  ex();.  zErr = d
31de0 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  lerror();.  if( 
31df0 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  zErr ){.    sqli
31e00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
31e10 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22  f, zBufOut, "%s"
31e20 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75  , zErr);.  }.  u
31e30 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
31e40 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
31e50 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74  *unixDlSym(sqlit
31e60 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
31e70 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20   void *p, const 
31e80 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64  char*zSym))(void
31e90 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43  ){.  /* .  ** GC
31ea0 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  C with -pedantic
31eb0 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61  -errors says tha
31ec0 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61  t C90 does not a
31ed0 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20  llow a void* to 
31ee0 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74  be.  ** cast int
31ef0 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  o a pointer to a
31f00 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20   function.  And 
31f10 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  yet the library 
31f20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a  dlsym() routine.
31f30 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76    ** returns a v
31f40 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65  oid* which is re
31f50 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
31f60 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  o a function.  S
31f70 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a  o how do we.  **
31f80 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74   use dlsym() wit
31f90 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
31fa0 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  rs?.  **.  ** Va
31fb0 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69  riable x below i
31fc0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
31fd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
31fe0 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20  unction taking. 
31ff0 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76   ** parameters v
32000 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63  oid* and const c
32010 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69  har* and returni
32020 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
32030 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  a function..  **
32040 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78   We initialize x
32050 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74   by assigning it
32060 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
32070 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69  e dlsym() functi
32080 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61  on..  ** (That a
32090 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  ssignment requir
320a0 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65  es a cast.)  The
320b0 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75  n we call the fu
320c0 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a  nction that.  **
320d0 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a   x points to.  .
320e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77    **.  ** This w
320f0 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e  ork-around is un
32100 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63  likely to work c
32110 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20  orrectly on any 
32120 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a  system where.  *
32130 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e  * you really can
32140 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74  not cast a funct
32150 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ion pointer into
32160 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65   void*.  But the
32170 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f  n, on the.  ** o
32180 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d  ther hand, dlsym
32190 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  () will not work
321a0 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65   on such a syste
321b0 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20  m either, so we 
321c0 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  have.  ** not re
321d0 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69  ally lost anythi
321e0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20  ng..  */.  void 
321f0 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e  (*(*x)(void*,con
32200 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
32210 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32220 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32230 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28   x = (void(*(*)(
32240 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
32250 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b  *))(void))dlsym;
32260 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70  .  return (*x)(p
32270 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69  , zSym);.}.stati
32280 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f  c void unixDlClo
32290 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
322a0 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
322b0 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
322c0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
322d0 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28  sed);.  dlclose(
322e0 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
322f0 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
32300 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
32310 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
32320 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  /.  #define unix
32330 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
32340 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20  ine unixDlError 
32350 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
32360 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
32370 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20  ine unixDlClose 
32380 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
32390 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  Write nBuf bytes
323a0 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20   of random data 
323b0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
323c0 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a  buffer zBuf..*/.
323d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
323e0 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
323f0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
32400 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
32410 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
32420 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
32430 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69  d);.  assert((si
32440 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65  ze_t)nBuf>=(size
32450 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f  of(time_t)+sizeo
32460 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20  f(int)));..  /* 
32470 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
32480 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
32490 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
324a0 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
324b0 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
324c0 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
324d0 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
324e0 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
324f0 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
32500 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
32510 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
32520 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
32530 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
32540 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
32550 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
32560 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
32570 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
32580 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
32590 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
325a0 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
325b0 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
325c0 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
325d0 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
325e0 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
325f0 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
32600 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
32610 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
32620 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
32630 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
32640 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
32650 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
32660 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
32670 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
32680 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
32690 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
326a0 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
326b0 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
326c0 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
326d0 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
326e0 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
326f0 42 75 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65  Buf);.  randomne
32700 73 73 50 69 64 20 3d 20 67 65 74 70 69 64 28 29  ssPid = getpid()
32710 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ;  .#if !defined
32720 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
32730 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f  {.    int fd, go
32740 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  t;.    fd = robu
32750 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72  st_open("/dev/ur
32760 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
32770 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
32780 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
32790 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
327a0 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
327b0 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
327c0 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d  eof(t));.      m
327d0 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
327e0 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e  of(t)], &randomn
327f0 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72  essPid, sizeof(r
32800 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a  andomnessPid));.
32810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
32820 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72  zeof(t)+sizeof(r
32830 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28  andomnessPid)<=(
32840 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
32850 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
32860 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72  of(t) + sizeof(r
32870 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20  andomnessPid);. 
32880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32890 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64  do{ got = osRead
328a0 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  (fd, zBuf, nBuf)
328b0 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
328c0 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
328d0 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
328e0 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
328f0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
32900 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
32910 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
32920 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
32930 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
32940 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
32950 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
32960 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
32970 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
32980 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
32990 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
329a0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
329b0 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
329c0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
329d0 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
329e0 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
329f0 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
32a00 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
32a10 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
32a20 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
32a30 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
32a40 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
32a50 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
32a60 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
32a70 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
32a80 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
32a90 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  p(sqlite3_vfs *N
32aa0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72  otUsed, int micr
32ab0 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f  oseconds){.#if O
32ac0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
32ad0 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a  ct timespec sp;.
32ae0 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d  .  sp.tv_sec = m
32af0 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30  icroseconds / 10
32b00 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e  00000;.  sp.tv_n
32b10 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  sec = (microseco
32b20 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a  nds % 1000000) *
32b30 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65   1000;.  nanosle
32b40 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20  ep(&sp, NULL);. 
32b50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
32b60 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
32b70 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
32b80 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
32b90 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
32ba0 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
32bb0 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
32bc0 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
32bd0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32be0 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
32bf0 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20  seconds;.#else. 
32c00 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28   int seconds = (
32c10 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39  microseconds+999
32c20 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20  999)/1000000;.  
32c30 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a  sleep(seconds);.
32c40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32c50 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
32c60 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30  eturn seconds*10
32c70 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  00000;.#endif.}.
32c80 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
32c90 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
32ca0 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
32cb0 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
32cc0 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
32cd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
32ce0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
32cf0 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
32d00 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
32d10 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
32d20 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
32d30 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
32d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
32d50 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
32d60 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
32d70 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
32d80 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
32d90 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
32da0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
32db0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
32dc0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
32dd0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
32de0 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
32df0 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
32e00 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
32e10 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
32e20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
32e30 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
32e40 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
32e50 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
32e60 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
32e70 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
32e80 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
32e90 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
32ea0 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
32eb0 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
32ec0 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
32ed0 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
32ee0 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
32ef0 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
32f00 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
32f10 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
32f20 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
32f30 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
32f40 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74   date .** cannot
32f50 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
32f60 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
32f70 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
32f80 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
32f90 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
32fa0 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
32fb0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
32fc0 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
32fd0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
32fe0 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
32ff0 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  000;.  int rc = 
33000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64  SQLITE_OK;.#if d
33010 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44  efined(NO_GETTOD
33020 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ).  time_t t;.  
33030 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e  time(&t);.  *piN
33040 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  ow = ((sqlite3_i
33050 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75  nt64)t)*1000 + u
33060 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20  nixEpoch;.#elif 
33070 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
33080 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f  uct timespec sNo
33090 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69  w;.  clock_getti
330a0 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d  me(CLOCK_REALTIM
330b0 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69  E, &sNow);.  *pi
330c0 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
330d0 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
330e0 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
330f0 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  c + sNow.tv_nsec
33100 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a  /1000000;.#else.
33110 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
33120 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74   sNow;.  if( get
33130 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
33140 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70   0)==0 ){.    *p
33150 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
33160 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
33170 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
33180 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65  ec + sNow.tv_use
33190 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b  c/1000;.  }else{
331a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
331b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64  _ERROR;.  }.#end
331c0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
331d0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
331e0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
331f0 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
33200 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
33210 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
33220 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
33230 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
33240 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
33250 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33260 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33270 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
33280 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
33290 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
332a0 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
332b0 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
332c0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
332d0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
332e0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
332f0 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
33300 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
33310 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
33320 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
33330 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
33340 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
33350 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
33360 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20  NotUsed, double 
33370 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74  *prNow){.  sqlit
33380 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a  e3_int64 i = 0;.
33390 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53    int rc;.  UNUS
333a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
333b0 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e  Used);.  rc = un
333c0 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
333d0 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72  64(0, &i);.  *pr
333e0 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
333f0 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .0;.  return rc;
33400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64  .}../*.** We add
33410 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45  ed the xGetLastE
33420 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69  rror() method wi
33430 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e  th the intention
33440 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a   of providing.**
33450 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65   better low-leve
33460 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  l error messages
33470 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d   when operating-
33480 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20  system problems 
33490 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e  come up.** durin
334a0 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69  g SQLite operati
334b0 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c  on.  But so far,
334c0 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61   none of that ha
334d0 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  s been implement
334e0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72  ed.** in the cor
334f0 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74  e.  So this rout
33500 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
33510 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69  led.  For now, i
33520 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61  t is merely.** a
33530 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a   place-holder..*
33540 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
33550 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
33560 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
33570 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
33580 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33  , char *NotUsed3
33590 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
335a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
335b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
335c0 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  ER(NotUsed2);.  
335d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
335e0 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65  (NotUsed3);.  re
335f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
33600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33610 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
33620 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
33630 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
33640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
33650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
336a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
336b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
336f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
33710 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
33720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
33740 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
33750 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
33760 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
33770 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
33780 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
33790 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
337a0 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
337b0 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
337c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
337d0 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
337e0 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
337f0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
33800 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
33810 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
33820 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
33830 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
33840 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
33850 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
33860 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
33870 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
33880 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
33890 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
338a0 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
338b0 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
338c0 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
338d0 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
338e0 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
338f0 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
33900 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
33910 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
33920 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
33930 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
33940 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
33950 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
33960 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
33970 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
33980 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
33990 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
339a0 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
339b0 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
339c0 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
339d0 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
339e0 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
339f0 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
33a00 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
33a10 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
33a20 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
33a30 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
33a40 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
33a50 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
33a60 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
33a70 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
33a80 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
33a90 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
33aa0 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
33ab0 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
33ac0 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
33ad0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
33ae0 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
33af0 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
33b00 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
33b10 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
33b20 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
33b30 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
33b40 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
33b50 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
33b60 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
33b70 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
33b80 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
33b90 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
33ba0 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
33bb0 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
33bc0 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
33bd0 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
33be0 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
33bf0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
33c00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
33c10 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
33c20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20  0x40000000.**   
33c30 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
33c40 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
33c50 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
33c60 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
33c70 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
33c80 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
33c90 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
33ca0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
33cb0 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
33cc0 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
33cd0 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
33ce0 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
33cf0 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
33d00 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
33d10 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
33d20 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
33d30 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
33d40 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
33d50 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
33d60 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
33d70 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
33d80 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
33d90 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
33da0 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
33db0 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
33dc0 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
33dd0 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
33de0 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
33df0 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
33e00 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
33e10 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
33e20 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
33e30 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
33e40 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
33e50 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
33e60 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
33e70 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
33e80 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
33e90 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
33ea0 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
33eb0 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
33ec0 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
33ed0 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
33ee0 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
33ef0 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
33f00 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
33f10 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
33f20 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
33f30 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
33f40 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
33f50 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
33f60 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
33f70 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
33f80 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
33f90 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
33fa0 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
33fb0 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
33fc0 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
33fd0 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
33fe0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
33ff0 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
34000 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
34010 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
34020 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
34030 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
34040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
34050 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
34060 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
34070 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
34080 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ame, SQLITE_SET_
34090 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
340a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
340b0 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70          <proxy_p
340c0 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29  ath> | ":auto:")
340d0 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.**  sqlite3_fi
340e0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
340f0 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45  bname, SQLITE_GE
34100 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
34110 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b   &<proxy_path>);
34120 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72  .**.**.** SQL pr
34130 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41  agmas.**.**  PRA
34140 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
34150 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c  ock_proxy_file=<
34160 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61  proxy_path> | :a
34170 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  uto:.**  PRAGMA 
34180 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
34190 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a  proxy_file.**.**
341a0 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75   Specifying ":au
341b0 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20  to:" means that 
341c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  if there is a co
341d0 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20  nch file with a 
341e0 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74  matching.** host
341f0 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70   ID in it, the p
34200 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65  roxy path in the
34210 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
34220 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77   be used, otherw
34230 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70  ise.** a proxy p
34240 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ath based on the
34250 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72   user's temp dir
34260 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72  .** (via confstr
34270 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
34280 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20  _TEMP_DIR,...)) 
34290 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64  will be used and
342a0 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70   the.** actual p
342b0 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  roxy file name i
342c0 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
342d0 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61   the name and pa
342e0 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  th of the.** dat
342f0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72  abase file.  For
34300 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
34310 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61        For databa
34320 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f  se path "/Users/
34330 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20  me/foo.db" .**  
34340 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61       The lock pa
34350 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70  th will be "<tmp
34360 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b  dir>/sqliteplock
34370 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e  s/_Users_me_foo.
34380 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a  db:auto:").**.**
34390 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f   Once a lock pro
343a0 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  xy is configured
343b0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
343c0 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63  connection, it c
343d0 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d  an not.** be rem
343e0 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74  oved, however it
343f0 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64   may be switched
34400 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
34410 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a  proxy path via.*
34420 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73  * the above APIs
34430 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63   (assuming the c
34440 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74  onch file is not
34450 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61   being held by a
34460 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63  nother.** connec
34470 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29  tion or process)
34480 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20  . .**.**.** How 
34490 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f  proxy locking wo
344a0 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  rks.** ---------
344b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
344c0 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20  *.** Proxy file 
344d0 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70  locking relies p
344e0 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20  rimarily on two 
344f0 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66  new supporting f
34500 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  iles: .**.**   *
34510 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20    conch file to 
34520 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20  limit access to 
34530 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34540 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f  e to a single ho
34550 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20  st.**      at a 
34560 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  time.**.**   *  
34570 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63  proxy file to ac
34580 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72  t as a proxy for
34590 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f   the advisory lo
345a0 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  cks normally.** 
345b0 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68       taken on th
345c0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  e database.**.**
345d0 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
345e0 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79  - to use a proxy
345f0 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75   file, sqlite mu
34600 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74  st first "hold t
34610 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20  he conch".** by 
34620 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  taking an sqlite
34630 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f  -style shared lo
34640 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
34650 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68  file, reading th
34660 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e  e.** contents an
34670 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  d comparing the 
34680 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f  host's unique ho
34690 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77  st ID (see below
346a0 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72  ) and lock.** pr
346b0 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74  oxy path against
346c0 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
346d0 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e  ed in the conch.
346e0 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65    The conch file
346f0 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e   is.** stored in
34700 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
34710 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62  ory as the datab
34720 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
34730 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73   file name.** is
34740 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72   patterned after
34750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34760 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61  le name as ".<da
34770 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63  tabasename>-conc
34780 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  h"..** If the co
34790 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nch file does no
347a0 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 73 20  t exist, or its 
347b0 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
347c0 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73  match the.** hos
347d0 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78  t ID and/or prox
347e0 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65  y path, then the
347f0 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74   lock is escalat
34800 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69  ed to an exclusi
34810 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74  ve.** lock and t
34820 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
34830 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65  ntents is update
34840 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20  d with the host 
34850 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20  ID and proxy.** 
34860 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63  path and the loc
34870 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20  k is downgraded 
34880 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
34890 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20   again.  If the 
348a0 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64  conch.** is held
348b0 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   by another proc
348c0 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72  ess (with a shar
348d0 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78  ed lock), the ex
348e0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
348f0 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51  will fail and SQ
34900 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
34910 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
34920 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20   proxy file - a 
34930 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65  single-byte file
34940 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64   used for all ad
34950 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b  visory file lock
34960 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61  s.** normally ta
34970 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
34980 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73  ase file.   This
34990 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65   allows for safe
349a0 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74   sharing.** of t
349b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
349c0 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65   for multiple re
349d0 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
349e0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
349f0 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68   host (the conch
34a00 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
34a10 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73  ey all use the s
34a20 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  ame local lock f
34a30 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75  ile)..**.** Requ
34a40 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  esting the lock 
34a50 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69  proxy does not i
34a60 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20  mmediately take 
34a70 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73  the conch, it is
34a80 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77  .** only taken w
34a90 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65  hen the first re
34aa0 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61  quest to lock da
34ab0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
34ac0 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d  ade.  .** This m
34ad0 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e  atches the seman
34ae0 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64  tics of the trad
34af0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  itional locking 
34b00 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a  behavior, where.
34b10 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e  ** opening a con
34b20 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
34b30 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20  abase file does 
34b40 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20  not take a lock 
34b50 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68  on it..** The sh
34b60 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e  ared lock and an
34b70 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   open file descr
34b80 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61  iptor are mainta
34b90 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74  ined until .** t
34ba0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
34bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
34bc0 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   closed. .**.** 
34bd0 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61  The proxy file a
34be0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  nd the lock file
34bf0 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74   are never delet
34c00 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20  ed so they only 
34c10 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72  need.** to be cr
34c20 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20  eated the first 
34c30 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73  time they are us
34c40 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67  ed..**.** Config
34c50 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a  uration options.
34c60 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
34c70 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20  --------.**.**  
34c80 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
34c90 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a  OXY_LOCKING.**.*
34ca0 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65  *       Database
34cb0 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20   files accessed 
34cc0 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  on non-local fil
34cd0 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a  e systems are.**
34ce0 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63         automatic
34cf0 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ally configured 
34d00 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
34d10 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72  g, lock files ar
34d20 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64  e.**       named
34d30 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
34d40 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
34d50 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  gic as.**       
34d60 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78  PRAGMA lock_prox
34d70 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a  y_file=":auto:".
34d80 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54  **    .**  SQLIT
34d90 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a  E_PROXY_DEBUG.**
34da0 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65  .**       Enable
34db0 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66  s the logging of
34dc0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
34dd0 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66  during host id f
34de0 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ile.**       ret
34df0 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74  rieval and creat
34e00 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50  ion.**.**  LOCKP
34e10 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20  ROXYDIR.**.**   
34e20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68      Overrides th
34e30 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
34e40 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
34e50 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68  k proxy files th
34e60 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  at.**       are 
34e70 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
34e80 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75  lly via the ":au
34e90 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a  to:" setting.**.
34ea0 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55  **  SQLITE_DEFAU
34eb0 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
34ec0 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20  ISSIONS.**.**   
34ed0 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20      Permissions 
34ee0 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61  to use when crea
34ef0 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ting a directory
34f00 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65   for storing the
34f10 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70  .**       lock p
34f20 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79  roxy files, only
34f30 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50   used when LOCKP
34f40 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73  ROXYDIR is not s
34f50 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20  et..**    .**   
34f60 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65   .** As mentione
34f70 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f  d above, when co
34f80 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
34f90 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
34fa0 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74  LOCKING,.** sett
34fb0 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  ing the environm
34fc0 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c  ent variable SQL
34fd0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
34fe0 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c  LOCKING to 1 wil
34ff0 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79  l.** force proxy
35000 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75   locking to be u
35010 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61  sed for every da
35020 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
35030 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c  ed, and 0.** wil
35040 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69  l force automati
35050 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  c proxy locking 
35060 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66  to be disabled f
35070 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
35080 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63  ** files (explic
35090 69 74 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  itly calling the
350a0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
350b0 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61  PROXYFILE pragma
350c0 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69   or.** sqlite_fi
350d0 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69  le_control API i
350e0 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62  s not affected b
350f0 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  y SQLITE_FORCE_P
35100 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a  ROXY_LOCKING)..*
35110 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  /../*.** Proxy l
35120 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
35130 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
35140 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  SX .*/.#if defin
35150 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
35160 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
35170 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
35180 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63  .** The proxyLoc
35190 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20  kingContext has 
351a0 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c  the path and fil
351b0 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
351c0 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20   the remote .** 
351d0 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20  and local proxy 
351e0 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74  files in it.*/.t
351f0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72  ypedef struct pr
35200 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
35210 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
35220 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72  ntext;.struct pr
35230 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
35240 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t {.  unixFile *
35250 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20  conchFile;      
35260 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68     /* Open conch
35270 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
35280 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20  *conchFilePath; 
35290 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
352a0 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
352b0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
352c0 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20  *lockProxy;     
352d0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78      /* Open prox
352e0 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
352f0 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79   char *lockProxy
35300 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
35310 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
35320 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
35330 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20    char *dbPath; 
35340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35350 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
35360 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  en file */.  int
35370 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20   conchHeld;     
35380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69            /* 1 i
35390 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68  f the conch is h
353a0 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c  eld, -1 if lockl
353b0 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  ess */.  void *o
353c0 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
353d0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
353e0 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
353f0 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
35400 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
35410 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
35420 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
35430 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
35440 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
35450 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
35460 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
35470 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
35480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
35490 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
354a0 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
354b0 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
354c0 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
354d0 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
354e0 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
354f0 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
35500 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
35510 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35520 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
35530 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
35540 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
35550 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
35560 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
35570 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
35580 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
35590 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
355a0 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
355b0 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
355c0 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
355d0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
355e0 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
355f0 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
35600 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
35610 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
35620 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
35630 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
35640 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
35650 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
35660 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
35670 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
35680 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
35690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
356a0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
356b0 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
356c0 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
356d0 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
356e0 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
356f0 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
35700 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
35710 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
35720 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
35730 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
35740 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
35750 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
35760 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
35770 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
35780 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
35790 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
357a0 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
357b0 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
357c0 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
357d0 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
357e0 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74  & (i+len+7)<(int
357f0 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  )maxLen; i++){. 
35800 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61     char c = dbPa
35810 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68  th[i];.    lPath
35820 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f  [i+len] = (c=='/
35830 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20  ')?'_':c;.  }.  
35840 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30  lPath[i+len]='\0
35850 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61  ';.  strlcat(lPa
35860 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61  th, ":auto:", ma
35870 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45  xLen);.  OSTRACE
35880 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
35890 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
358a0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50  %s pid=%d\n", lP
358b0 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ath, getpid()));
358c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
358d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20  _OK;.}../* . ** 
358e0 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b  Creates the lock
358f0 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69   file and any mi
35900 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  ssing directorie
35910 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a  s in lockPath. *
35920 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
35930 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
35940 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63  (const char *loc
35950 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c  kPath){.  int i,
35960 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66   len;.  char buf
35970 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
35980 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20  int start = 0;. 
35990 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50   .  assert(lockP
359a0 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a  ath!=NULL);.  /*
359b0 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
359c0 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  ll the intermedi
359d0 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  ate directories 
359e0 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29  */.  len = (int)
359f0 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29  strlen(lockPath)
35a00 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63  ;.  buf[0] = loc
35a10 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28  kPath[0];.  for(
35a20 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b   i=1; i<len; i++
35a30 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
35a40 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26  Path[i] == '/' &
35a50 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30  & (i - start > 0
35a60 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e  ) ){.      /* on
35a70 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66  ly mkdir if leaf
35a80 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22   dir != "." or "
35a90 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20  /" or ".." */.  
35aa0 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e      if( i-start>
35ab0 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31  2 || (i-start==1
35ac0 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
35ad0 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
35ae0 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20  rt] != '/') .   
35af0 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72        || (i-star
35b00 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72  t==2 && buf[star
35b10 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
35b20 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27  [start+1] != '.'
35b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66  ) ){.        buf
35b40 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20  [i]='\0';.      
35b50 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75    if( osMkdir(bu
35b60 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  f, SQLITE_DEFAUL
35b70 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
35b80 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20  SSIONS) ){.     
35b90 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72       int err=err
35ba0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  no;.          if
35bb0 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20  ( err!=EEXIST ) 
35bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53  {.            OS
35bd0 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f  TRACE(("CREATELO
35be0 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63  CKPATH  FAILED c
35bf0 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20  reating %s, ".  
35c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c10 20 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c     "'%s' proxy l
35c20 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
35c30 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
35c40 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c              buf,
35c50 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20   strerror(err), 
35c60 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64  lockPath, getpid
35c70 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ()));.          
35c80 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20    return err;.  
35c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35ca0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
35cb0 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20    start=i+1;.   
35cc0 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20   }.    buf[i] = 
35cd0 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d  lockPath[i];.  }
35ce0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45  .  OSTRACE(("CRE
35cf0 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  ATELOCKPATH  pro
35d00 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
35d10 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50  pid=%d\n", lockP
35d20 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ath, getpid()));
35d30 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
35d40 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
35d50 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63  ew VFS file desc
35d60 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69  riptor (stored i
35d70 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
35d80 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
35d90 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70  3_malloc) and op
35da0 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  en the file name
35db0 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20  d "path" in the 
35dc0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
35dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
35de0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
35df0 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c   not only for cl
35e00 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  osing the file d
35e10 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74  escriptor.** but
35e20 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e   also for freein
35e30 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73  g the memory ass
35e40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
35e50 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
35e60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35e70 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
35e80 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile(.    const c
35e90 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
35ea0 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68    /* path for th
35eb0 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a  e new unixFile *
35ec0 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  /.    unixFile *
35ed0 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f  *ppFile,       /
35ee0 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74  * unixFile creat
35ef0 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ed and returned 
35f00 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e  by ref */.    in
35f10 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20  t islockfile    
35f20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e         /* if non
35f30 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69   zero missing di
35f40 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  rs will be creat
35f50 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20  ed */.) {.  int 
35f60 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46  fd = -1;.  unixF
35f70 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ile *pNew;.  int
35f80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35f90 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
35fa0 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
35fb0 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  EAT;.  sqlite3_v
35fc0 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69  fs dummyVfs;.  i
35fd0 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20  nt terrno = 0;. 
35fe0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
35ff0 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a  Unused = NULL;..
36000 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72    /* 1. first tr
36010 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  y to open/create
36020 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32   the file.  ** 2
36030 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c  . if that fails,
36040 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c   and this is a l
36050 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f  ock file (not-co
36060 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69  nch), try creati
36070 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65  ng.  ** the pare
36080 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61  nt directories a
36090 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69  nd then try agai
360a0 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68  n..  ** 3. if th
360b0 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f  at fails, try to
360c0 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72   open the file r
360d0 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74  ead-only.  ** ot
360e0 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42  herwise return B
360f0 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c  USY (if lock fil
36100 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66  e) or CANTOPEN f
36110 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  or the conch fil
36120 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64  e.  */.  pUnused
36130 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
36140 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  d(path, openFlag
36150 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65  s);.  if( pUnuse
36160 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55  d ){.    fd = pU
36170 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c  nused->fd;.  }el
36180 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  se{.    pUnused 
36190 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
361a0 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
361b0 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e  ));.    if( !pUn
361c0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65  used ){.      re
361d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
361e0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
361f0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66  f( fd<0 ){.    f
36200 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
36210 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
36220 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20   0);.    terrno 
36230 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
36240 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   fd<0 && errno==
36250 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b  ENOENT && islock
36260 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  file ){.      if
36270 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  ( proxyCreateLoc
36280 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53  kPath(path) == S
36290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
362a0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
362b0 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
362c0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
362d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
362e0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70  ( fd<0 ){.    op
362f0 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e  enFlags = O_RDON
36300 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  LY;.    fd = rob
36310 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
36320 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
36330 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
36340 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  ;.  }.  if( fd<0
36350 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f   ){.    if( islo
36360 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  ckfile ){.      
36370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
36380 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  SY;.    }.    sw
36390 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a  itch (terrno) {.
363a0 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45        case EACCE
363b0 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  S:.        retur
363c0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
363d0 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a       case EIO: .
363e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
363f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
36400 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ; /* even though
36410 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68   it is the conch
36420 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c   */.      defaul
36430 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  t:.        retur
36440 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
36450 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
36460 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75  }.  .  pNew = (u
36470 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65  nixFile *)sqlite
36480 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
36490 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
364a0 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  New==NULL ){.   
364b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
364c0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  EM;.    goto end
364d0 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20  _create_proxy;. 
364e0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
364f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
36500 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  File));.  pNew->
36510 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
36520 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28  Flags;.  memset(
36530 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69  &dummyVfs, 0, si
36540 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b  zeof(dummyVfs));
36550 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70  .  dummyVfs.pApp
36560 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61  Data = (void*)&a
36570 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b  utolockIoFinder;
36580 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d  .  dummyVfs.zNam
36590 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70  e = "dummy";.  p
365a0 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
365b0 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  .  pUnused->flag
365c0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
365d0 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d   pNew->pUnused =
365e0 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72   pUnused;.  .  r
365f0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
36600 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
36610 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  , (sqlite3_file*
36620 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b  )pNew, path, 0);
36630 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
36650 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
36660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36670 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
36680 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f  _proxy:    .  ro
36690 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
366a0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
366b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
366c0 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
366d0 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
366e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
366f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
36700 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
36710 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
36720 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
36730 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
36740 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
36750 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
36760 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
36770 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
36780 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
36790 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
367a0 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20  ngth */../* Not 
367b0 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
367c0 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
367d0 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
367e0 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
367f0 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
36800 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
36810 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
36820 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  );../* get the h
36830 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f  ost ID via getho
36840 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49  stuuid(), pHostI
36850 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  D must point to 
36860 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
36870 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69  .** bytes of wri
36880 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  table memory..*/
36890 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
368a0 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67  yGetHostID(unsig
368b0 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49  ned char *pHostI
368c0 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
368d0 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f  .  assert(PROXY_
368e0 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a  HOSTIDLEN == siz
368f0 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20  eof(uuid_t));.  
36900 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20  memset(pHostID, 
36910 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  0, PROXY_HOSTIDL
36920 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  EN);.#if defined
36930 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53  (__MAX_OS_X_VERS
36940 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
36950 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
36960 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f    && __MAC_OS_X_
36970 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
36980 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20  IRED<1050.  {.  
36990 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
369a0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74  truct timespec t
369b0 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b  imeout = {1, 0};
369c0 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75   /* 1 sec timeou
369d0 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74  t */.    if( get
369e0 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
369f0 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
36a00 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
36a10 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
36a20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
36a30 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b    *pError = err;
36a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
36a50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
36a60 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
36a70 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
36a80 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a  AMETER(pError);.
36a90 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
36aa0 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73  LITE_TEST.  /* s
36ab0 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
36ac0 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
36ad0 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
36ae0 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20   file paths */. 
36af0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73   if( sqlite3_hos
36b00 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20  tid_num != 0){. 
36b10 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20     pHostID[0] = 
36b20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30  (char)(pHostID[0
36b30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74  ] + (char)(sqlit
36b40 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20  e3_hostid_num & 
36b50 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  0xFF));.  }.#end
36b60 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53  if.  .  return S
36b70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
36b80 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  The conch file c
36b90 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64  ontains the head
36ba0 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20  er, host id and 
36bb0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
36bc0 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
36bd0 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20  _CONCHVERSION 2 
36be0 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64    /* 1-byte head
36bf0 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74  er, 16-byte host
36c00 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65   id, path */.#de
36c10 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45  fine PROXY_HEADE
36c20 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63  RLEN    1   /* c
36c30 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72  onch file header
36c40 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69   length */.#defi
36c50 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  ne PROXY_PATHIND
36c60 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41  EX    (PROXY_HEA
36c70 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
36c80 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20  TIDLEN).#define 
36c90 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
36ca0 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52  N  (PROXY_HEADER
36cb0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
36cc0 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a  LEN+MAXPATHLEN).
36cd0 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ./* .** Takes an
36ce0 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   open conch file
36cf0 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e  , copies the con
36d00 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70  tents to a new p
36d10 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76  ath and then mov
36d20 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20  es .** it back. 
36d30 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74   The newly creat
36d40 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64  ed file's file d
36d50 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73  escriptor is ass
36d60 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  igned to the.** 
36d70 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63  conch file struc
36d80 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ture and finally
36d90 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
36da0 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  nch file descrip
36db0 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65  tor is .** close
36dc0 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f  d.  Returns zero
36dd0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
36de0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
36df0 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
36e00 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
36e10 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
36e20 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  ID){.  proxyLock
36e30 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36e40 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36e50 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
36e60 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
36e70 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f   .  unixFile *co
36e80 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
36e90 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61  conchFile;.  cha
36ea0 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r tPath[MAXPATHL
36eb0 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  EN];.  char buf[
36ec0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
36ed0 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74  N];.  char *cPat
36ee0 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h = pCtx->conchF
36ef0 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f  ilePath;.  size_
36f00 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
36f10 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
36f20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d  = 0;.  char errm
36f30 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69  sg[64] = "";.  i
36f40 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
36f50 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55  t rc = -1;.  UNU
36f60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79  SED_PARAMETER(my
36f70 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63  HostID);..  /* c
36f80 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68  reate a new path
36f90 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20   by replace the 
36fa0 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68  trailing '-conch
36fb0 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20  ' with '-break' 
36fc0 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73  */.  pathLen = s
36fd0 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50  trlcpy(tPath, cP
36fe0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
36ff0 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e  ;.  if( pathLen>
37000 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61  MAXPATHLEN || pa
37010 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20  thLen<6 || .    
37020 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68   (strlcpy(&tPath
37030 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72  [pathLen-5], "br
37040 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29  eak", 6) != 5) )
37050 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
37060 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
37070 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61  rmsg),errmsg,"pa
37080 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  th error (len %d
37090 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29  )",(int)pathLen)
370a0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
370b0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
370c0 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63  /* read the conc
370d0 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72  h content */.  r
370e0 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64  eadLen = osPread
370f0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62  (conchFile->h, b
37100 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
37110 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28  CHLEN, 0);.  if(
37120 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50   readLen<PROXY_P
37130 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20  ATHINDEX ){.    
37140 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
37150 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
37160 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72  errmsg,"read err
37170 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e  or (len %d)",(in
37180 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20  t)readLen);.    
37190 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
371a0 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69  ck;.  }.  /* wri
371b0 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
371c0 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b   temporary break
371d0 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20   file */.  fd = 
371e0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74  robust_open(tPat
371f0 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  h, (O_RDWR|O_CRE
37200 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a  AT|O_EXCL), 0);.
37210 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
37220 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
37230 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
37240 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61  ), errmsg, "crea
37250 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
37260 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
37270 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
37280 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72  .  }.  if( osPwr
37290 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61  ite(fd, buf, rea
372a0 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69  dLen, 0) != (ssi
372b0 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a  ze_t)readLen ){.
372c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
372d0 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
372e0 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72  sg), errmsg, "wr
372f0 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ite failed (%d)"
37300 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
37310 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
37320 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61  ;.  }.  if( rena
37330 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29  me(tPath, cPath)
37340 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
37350 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
37360 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
37370 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20   "rename failed 
37380 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
37390 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
373a0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  klock;.  }.  rc 
373b0 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  = 0;.  fprintf(s
373c0 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74  tderr, "broke st
373d0 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e  ale lock on %s\n
373e0 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62  ", cPath);.  rob
373f0 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
37400 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f   conchFile->h, _
37410 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63  _LINE__);.  conc
37420 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20  hFile->h = fd;. 
37430 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e   conchFile->open
37440 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
37450 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62   O_CREAT;..end_b
37460 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20  reaklock:.  if( 
37470 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64  rc ){.    if( fd
37480 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  >=0 ){.      osU
37490 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20  nlink(tPath);.  
374a0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
374b0 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49  (pFile, fd, __LI
374c0 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NE__);.    }.   
374d0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
374e0 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61   "failed to brea
374f0 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20  k stale lock on 
37500 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68  %s, %s\n", cPath
37510 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20  , errmsg);.  }. 
37520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37530 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75 65  * Take the reque
37540 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sted lock on the
37550 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20   conch file and 
37560 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f  break a stale lo
37570 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ck if the .** ho
37580 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a  st id matches..*
37590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
375a0 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  xyConchLock(unix
375b0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
375c0 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e  d_t myHostID, in
375d0 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70  t lockType){.  p
375e0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
375f0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
37600 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37610 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
37620 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78  Context; .  unix
37630 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
37640 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
37650 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
37660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
37670 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72  Tries = 0;.  str
37680 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e  uct timespec con
37690 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20  chModTime;.  .  
376a0 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64  memset(&conchMod
376b0 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Time, 0, sizeof(
376c0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a  conchModTime));.
376d0 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
376e0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
376f0 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
37700 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
37710 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  le, lockType);. 
37720 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20     nTries ++;.  
37730 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37740 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f  _BUSY ){.      /
37750 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61  * If the lock fa
37760 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20  iled (busy):.   
37770 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67      * 1st try: g
37780 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  et the mod time 
37790 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61  of the conch, wa
377a0 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20  it 0.5s and try 
377b0 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a  again. .       *
377c0 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69   2nd try: fail i
377d0 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63  f the mod time c
377e0 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69  hanged or host i
377f0 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20  d is different, 
37800 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20  wait .       *  
37810 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63 20           10 sec 
37820 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20  and try again.  
37830 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20       * 3rd try: 
37840 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75  break the lock u
37850 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69  nless the mod ti
37860 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a  me has changed..
37870 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
37880 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
37890 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
378a0 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  at(conchFile->h,
378b0 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20   &buf) ){.      
378c0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
378d0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
378e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
378f0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
37900 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
37910 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31     if( nTries==1
37920 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63   ){.        conc
37930 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73  hModTime = buf.s
37940 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20  t_mtimespec;.   
37950 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30       usleep(5000
37960 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35  00); /* wait 0.5
37970 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
37980 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20   lock again*/.  
37990 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
379a0 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
379b0 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e   assert( nTries>
379c0 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  1 );.      if( c
379d0 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73  onchModTime.tv_s
379e0 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
379f0 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c  mespec.tv_sec ||
37a00 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68   .         conch
37a10 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20  ModTime.tv_nsec 
37a20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
37a30 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20  pec.tv_nsec ){. 
37a40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
37a50 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
37a60 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
37a70 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b  if( nTries==2 ){
37a80 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20    .        char 
37a90 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  tBuf[PROXY_MAXCO
37aa0 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
37ab0 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65   int len = osPre
37ac0 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
37ad0 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58   tBuf, PROXY_MAX
37ae0 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
37af0 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20        if( len<0 
37b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
37b10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
37b20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
37b30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
37b40 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
37b50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
37b60 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49   len>PROXY_PATHI
37b70 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d  NDEX && tBuf[0]=
37b80 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
37b90 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20  CHVERSION){.    
37ba0 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
37bb0 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66  reak the lock if
37bc0 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65   the host id doe
37bd0 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20  sn't match */.  
37be0 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d          if( 0!=m
37bf0 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58  emcmp(&tBuf[PROX
37c00 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
37c10 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f  HostID, PROXY_HO
37c20 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20  STIDLEN) ){.    
37c30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
37c40 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
37c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
37c70 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
37c80 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72  the lock on shor
37c90 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73  t read or a vers
37ca0 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a  ion mismatch */.
37cb0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
37cc0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
37cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37ce0 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29  usleep(10000000)
37cf0 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63  ; /* wait 10 sec
37d00 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63   and try the loc
37d10 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  k again */.     
37d20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20     continue; .  
37d30 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
37d40 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
37d50 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  s==3 );.      if
37d60 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43  ( 0==proxyBreakC
37d70 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
37d80 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20  myHostID) ){.   
37d90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
37da0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
37db0 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55   lockType==EXCLU
37dc0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
37dd0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
37de0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
37df0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
37e00 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
37e10 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20  SHARED_LOCK);   
37e20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
37e30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72  }.        if( !r
37e40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
37e50 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
37e60 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
37e70 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
37e80 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
37e90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37ea0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77     }.    }.  } w
37eb0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
37ec0 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c  _BUSY && nTries<
37ed0 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  3 );.  .  return
37ee0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73   rc;.}../* Takes
37ef0 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61   the conch by ta
37f00 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  king a shared lo
37f10 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20  ck and read the 
37f20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20  contents conch, 
37f30 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  if .** lockPath 
37f40 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
37f50 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63   host ID and loc
37f60 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74  k file path must
37f70 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20   match.  A NULL 
37f80 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61  .** lockPath mea
37f90 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ns that the lock
37fa0 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  Path in the conc
37fb0 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
37fc0 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  sed if the .** h
37fd0 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f  ost IDs match, o
37fe0 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74  r a new lock pat
37ff0 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  h will be genera
38000 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
38010 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65  y .** and writte
38020 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66  n to the conch f
38030 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
38040 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  nt proxyTakeConc
38050 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
38060 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
38070 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
38080 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
38090 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
380a0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
380b0 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  .  .  if( pCtx->
380c0 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a  conchHeld!=0 ){.
380d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
380e0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
380f0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
38100 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
38110 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75  onchFile;.    uu
38120 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20  id_t myHostID;. 
38130 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
38140 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64  0;.    char read
38150 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
38160 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
38170 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
38180 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
38190 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20  *tempLockPath = 
381a0 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63  NULL;.    int rc
381b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
381c0 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63    int createConc
381d0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68  h = 0;.    int h
381e0 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a  ostIdMatch = 0;.
381f0 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20      int readLen 
38200 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79  = 0;.    int try
38210 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
38220 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65  .    int forceNe
38230 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  wLockPath = 0;. 
38240 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28     .    OSTRACE(
38250 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
38260 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
38270 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
38280 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
38290 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
382a0 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
382b0 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
382c0 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b  :"), getpid()));
382d0 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  ..    rc = proxy
382e0 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74  GetHostID(myHost
382f0 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20  ID, &pError);.  
38300 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
38310 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
38320 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
38330 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72  stErrno = pError
38340 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
38350 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
38360 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  }.    rc = proxy
38370 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
38380 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45   myHostID, SHARE
38390 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
383a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
383b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
383c0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
383d0 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68  }.    /* read th
383e0 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68  e existing conch
383f0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61   file */.    rea
38400 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65  dLen = seekAndRe
38410 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f  ad((unixFile*)co
38420 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64  nchFile, 0, read
38430 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
38440 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28  NCHLEN);.    if(
38450 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20   readLen<0 ){.  
38460 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72      /* I/O error
38470 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  : lastErrno set 
38480 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
38490 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  /.      pFile->l
384a0 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68  astErrno = conch
384b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
384c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
384d0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
384e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
384f0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c  keconch;.    }el
38500 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d  se if( readLen<=
38510 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
38520 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
38530 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
38540 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28     readBuf[0]!=(
38550 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
38560 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20  VERSION ){.     
38570 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64   /* a short read
38580 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d   or version form
38590 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e  at mismatch mean
385a0 73 20 7