/ Hex Artifact Content
Login

Artifact 1ec9390926a0626494466e572eb7754545acd3e423a4871a749fe35c09e0b6ab:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1130: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1140: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1150: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1160: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1170: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1180: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1190: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
11a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
11b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
11c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
11d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
11e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1200: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1210: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1220: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1230: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1240: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
1250: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1260: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1270: 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65  xy dir.*/.#ifnde
1280: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1290: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
12a0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
12b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
12c0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
12d0: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
12e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
12f0: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1300: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1310: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1320: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1330: 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f 6c  supported symbol
1340: 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65 66  ic links.*/.#def
1350: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
1360: 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a 20  YMLINKS 100../* 
1370: 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65 20  Always cast the 
1380: 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e 20  getpid() return 
1390: 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  type for compati
13a0: 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b  bility with.** k
13b0: 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e  ernel modules in
13c0: 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65   VxWorks. */.#de
13d0: 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29  fine osGetpid(X)
13e0: 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28 29   (pid_t)getpid()
13f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1400: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1410: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
1420: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
1430: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
1440: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
1450: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
1460: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
1470: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1480: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1490: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
14a0: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
14b0: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
14c0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
14d0: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
14e0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
14f0: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1500: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1510: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
1540: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
1550: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1560: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
1570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1590: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
15a0: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
15c0: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
15d0: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
15e0: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
15f0: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1600: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1610: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
1620: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
1630: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
1640: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
1650: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
1660: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
1670: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1680: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1690: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
16a0: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
16b0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
16c0: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
16d0: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
16e0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
16f0: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1700: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1710: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1720: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1740: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1750: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
1760: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
1770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1780: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1790: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
17a0: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
17b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
17c0: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
17d0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
17e0: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
17f0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1800: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1810: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
1820: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1830: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
1840: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
1850: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
1860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1870: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1880: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1890: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
18a0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
18b0: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
18c0: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
18d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
18e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1910: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1920: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1930: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1950: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1960: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1970: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19c0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19e0: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
19f0: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  .  unsigned shor
1a10: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int ctrlFlags;
1a20: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1a30: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1a40: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1a50: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a80: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1a90: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1aa0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1ab0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1ac0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1ad0: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1ae0: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1af0: 75 73 65 64 46 64 20 2a 70 50 72 65 61 6c 6c 6f  usedFd *pPreallo
1b00: 63 61 74 65 64 55 6e 75 73 65 64 3b 20 20 2f 2a  catedUnused;  /*
1b10: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1b20: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b40: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1b50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b60: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1b70: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ba0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1bb0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1bc0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1bf0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1c00: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1c10: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1c20: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c50: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
1c60: 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20  Fetch refs */.  
1c70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1c80: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
1c90: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
1ca0: 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74  ze of mapping at
1cb0: 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20   pMapRegion */. 
1cc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1cd0: 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
1ce0: 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73       /* Actual s
1cf0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1d00: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1d10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d20: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
1d30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1d40: 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  red FCNTL_MMAP_S
1d50: 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76  IZE value */.  v
1d60: 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b  oid *pMapRegion;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
1d90: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65  ped region */.#e
1da0: 6e 64 69 66 0a 20 20 69 6e 74 20 73 65 63 74 6f  ndif.  int secto
1db0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dd0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1de0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1df0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e10: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e20: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e40: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e50: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e60: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e80: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e90: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ea0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1eb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1ec0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1ed0: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1ee0: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1f10: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1f20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1f30: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1f40: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
1f50: 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *pId;          /
1f60: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
1f70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
1f80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1f90: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f   /* The next gro
1fa0: 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  up of variables 
1fb0: 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  are used to trac
1fc0: 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  k whether or not
1fd0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
1fe0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ction counter in
1ff0: 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20   bytes 24-27 of 
2000: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
2010: 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20  re updated.  ** 
2020: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72  whenever any par
2030: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
2040: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61  e changes.  An a
2050: 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2060: 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69  ill.  ** occur i
2070: 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61  f a file is upda
2080: 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f  ted without also
2090: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72   updating the tr
20a0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
20b0: 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65  ounter.  This te
20c0: 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76  st is made to av
20d0: 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73  oid new problems
20e0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a   similar to the.
20f0: 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62    ** one describ
2100: 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
2110: 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69  84. .  */.  unsi
2120: 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43  gned char transC
2130: 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72  ntrChng;   /* Tr
2140: 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  ue if the transa
2150: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68  ction counter ch
2160: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2170: 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74  ned char dbUpdat
2180: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
2190: 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  e if any part of
21a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
21b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
21c0: 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d  gned char inNorm
21d0: 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72  alWrite;   /* Tr
21e0: 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61  ue if in a norma
21f0: 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  l write operatio
2200: 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69  n */..#endif..#i
2210: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2220: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2230: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2240: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2250: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2260: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
2270: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2280: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
2290: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
22a0: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
22b0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
22c0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54  .#endif.};../* T
22d0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  his variable hol
22e0: 64 73 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  ds the process i
22f0: 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65  d (pid) from whe
2300: 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  n the xRandomnes
2310: 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61  s().** method wa
2320: 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f  s called.  If xO
2330: 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  pen() is called 
2340: 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74  from a different
2350: 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20   process id,.** 
2360: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2370: 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63  a fork() has occ
2380: 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20  urred, the PRNG 
2390: 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a  will be reset..*
23a0: 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74 20 72  /.static pid_t r
23b0: 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 30  andomnessPid = 0
23c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
23d0: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
23e0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
23f0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
2400: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2410: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
2420: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2430: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2440: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2450: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2460: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2470: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2480: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2490: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
24a0: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
24b0: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
24c0: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
24d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
24f0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2500: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
2510: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
2520: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
2530: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2540: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2550: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2560: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2570: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2580: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2590: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
25a0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
25b0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
25c0: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
25d0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
25e0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
25f0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
2600: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
2610: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
2620: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
2630: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2640: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2650: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2660: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2670: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2680: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2690: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
26a0: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
26b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
26c0: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
26d0: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
26e0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
26f0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
2700: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
2710: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
2720: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2730: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2750: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2760: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2770: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2780: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2790: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
27a0: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
27b0: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
27c0: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
27d0: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
27e0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
27f0: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
2800: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
2810: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2820: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2830: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2840: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2850: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
2860: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
2870: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
2880: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
2890: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
28a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
28b0: 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66 61 75  AVE_MREMAP defau
28c0: 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c  lts to true on L
28d0: 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65 20 65  inux and false e
28e0: 76 65 72 79 77 68 65 72 65 20 65 6c 73 65 2e 0a  verywhere else..
28f0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2900: 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69  HAVE_MREMAP).# i
2910: 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
2920: 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
2930: 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23 20 20  _GNU_SOURCE).#  
2940: 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d  define HAVE_MREM
2950: 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20 20 64  AP 1.# else.#  d
2960: 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41  efine HAVE_MREMA
2970: 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  P 0.# endif.#end
2980: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63  if../*.** Explic
2990: 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20 36 34  itly call the 64
29a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  -bit version of 
29b0: 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f  lseek() on Andro
29c0: 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  id. Otherwise, l
29d0: 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65  seek().** is the
29e0: 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c   32-bit version,
29f0: 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f   even if _FILE_O
2a00: 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73  FFSET_BITS=64 is
2a10: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
2a20: 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a  def __ANDROID__.
2a30: 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c  # define lseek l
2a40: 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 23  seek64.#endif..#
2a50: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
2a60: 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70 65 63  /*.** Linux-spec
2a70: 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67 69 63  ific IOCTL magic
2a80: 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 66 6f   numbers used fo
2a90: 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 46 32  r controlling F2
2aa0: 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 32  FS.*/.#define F2
2ab0: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 20 20  FS_IOCTL_MAGIC  
2ac0: 20 20 20 20 20 20 30 78 66 35 0a 23 64 65 66 69        0xf5.#defi
2ad0: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52  ne F2FS_IOC_STAR
2ae0: 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20  T_ATOMIC_WRITE  
2af0: 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54     _IO(F2FS_IOCT
2b00: 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64 65 66  L_MAGIC, 1).#def
2b10: 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d  ine F2FS_IOC_COM
2b20: 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  MIT_ATOMIC_WRITE
2b30: 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43      _IO(F2FS_IOC
2b40: 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23 64 65  TL_MAGIC, 2).#de
2b50: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54  fine F2FS_IOC_ST
2b60: 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49  ART_VOLATILE_WRI
2b70: 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f  TE   _IO(F2FS_IO
2b80: 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a 23 64  CTL_MAGIC, 3).#d
2b90: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 41  efine F2FS_IOC_A
2ba0: 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
2bb0: 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  ITE   _IO(F2FS_I
2bc0: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29 0a 23  OCTL_MAGIC, 5).#
2bd0: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
2be0: 47 45 54 5f 46 45 41 54 55 52 45 53 20 20 20 20  GET_FEATURES    
2bf0: 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32 46 53         _IOR(F2FS
2c00: 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 31 32  _IOCTL_MAGIC, 12
2c10: 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65 20 46  , u32).#define F
2c20: 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d  2FS_FEATURE_ATOM
2c30: 49 43 5f 57 52 49 54 45 20 30 78 30 30 30 34 0a  IC_WRITE 0x0004.
2c40: 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
2c50: 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  x__ */.../*.** D
2c60: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
2c70: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
2c80: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
2c90: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
2ca0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
2cb0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
2cc0: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
2cd0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2ce0: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
2cf0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
2d00: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
2d10: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2d20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
2d30: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
2d40: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
2d50: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
2d60: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
2d70: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
2d80: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
2d90: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
2da0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
2db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
2dc0: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
2dd0: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
2de0: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
2df0: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
2e00: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
2e10: 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  e);.}../* Forwar
2e20: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2e30: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
2e40: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
2e50: 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  ar*, int*);.stat
2e60: 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
2e70: 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f  gesize(void);../
2e80: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
2e90: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
2ea0: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
2eb0: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
2ec0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
2ed0: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
2ee0: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
2ef0: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
2f00: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
2f10: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
2f20: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
2f30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
2f40: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
2f50: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
2f60: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
2f70: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
2f80: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
2f90: 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61  truct unix_sysca
2fa0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
2fb0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
2fc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2fd0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2fe0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2ff0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3000: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3010: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3020: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3030: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3040: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3050: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3060: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20  aSyscall[] = {. 
3070: 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20   { "open",      
3080: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3090: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65  all_ptr)posixOpe
30a0: 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  n,  0  },.#defin
30b0: 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28  e osOpen      ((
30c0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
30d0: 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73  r*,int,int))aSys
30e0: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
30f0: 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20  )..  { "close", 
3100: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3110: 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73  syscall_ptr)clos
3120: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
3130: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20  efine osClose   
3140: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29    ((int(*)(int))
3150: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3160: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65  rent)..  { "acce
3170: 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ss",       (sqli
3180: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3190: 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d  access,     0  }
31a0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65  ,.#define osAcce
31b0: 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  ss    ((int(*)(c
31c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29  onst char*,int))
31d0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
31e0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63  rent)..  { "getc
31f0: 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wd",       (sqli
3200: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3210: 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d  getcwd,     0  }
3220: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63  ,.#define osGetc
3230: 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29  wd    ((char*(*)
3240: 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  (char*,size_t))a
3250: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3260: 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22  ent)..  { "stat"
3270: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3280: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73  e3_syscall_ptr)s
3290: 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  tat,       0  },
32a0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20  .#define osStat 
32b0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
32c0: 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74  nst char*,struct
32d0: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
32e0: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f  [4].pCurrent)../
32f0: 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63  *.** The DJGPP c
3300: 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d  ompiler environm
3310: 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79  ent looks mostly
3320: 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20   like Unix, but 
3330: 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20  it.** lacks the 
3340: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
3350: 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e  all.  So redefin
3360: 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20  e fcntl() to be 
3370: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61  something.** tha
3380: 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  t always succeed
3390: 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  s.  This means t
33a0: 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  hat locking does
33b0: 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72   not occur under
33c0: 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20  .** DJGPP.  But 
33d0: 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74  it is DOS - what
33e0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
33f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
3400: 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22  PP__.  { "fstat"
3410: 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  ,        0,     
3420: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d              0  }
3430: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
3440: 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65  t(a,b,c)    0.#e
3450: 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73  lse     .  { "fs
3460: 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71  tat",        (sq
3470: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3480: 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20  r)fstat,      0 
3490: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
34a0: 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29  tat     ((int(*)
34b0: 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74  (int,struct stat
34c0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70  *))aSyscall[5].p
34d0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
34e0: 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22  .  { "ftruncate"
34f0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3500: 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63  scall_ptr)ftrunc
3510: 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  ate,  0  },.#def
3520: 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20  ine osFtruncate 
3530: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
3540: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  _t))aSyscall[6].
3550: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3560: 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28  fcntl",        (
3570: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3580: 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20  ptr)fcntl,      
3590: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
35a0: 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28  Fcntl     ((int(
35b0: 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29  *)(int,int,...))
35c0: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
35d0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64  rent)..  { "read
35e0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
35f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3600: 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d  read,       0  }
3610: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  ,.#define osRead
3620: 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28        ((ssize_t(
3630: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
3640: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  e_t))aSyscall[8]
3650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3660: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3670: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
3680: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3690: 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  E.  { "pread",  
36a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
36b0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
36c0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  ,      0  },.#el
36d0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  se.  { "pread", 
36e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
36f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3700: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3710: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3720: 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65  read     ((ssize
3730: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
3740: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
3750: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
3760: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3770: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
3780: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
3790: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
37a0: 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20  ll_ptr)pread64, 
37b0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
37c0: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
37d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
37e0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
37f0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3800: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3810: 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28  64 ((ssize_t(*)(
3820: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3830: 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73 63 61  ,off64_t))aSysca
3840: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
3850: 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20  ..  { "write",  
3860: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3870: 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65  yscall_ptr)write
3880: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3890: 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20  fine osWrite    
38a0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
38b0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
38c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ze_t))aSyscall[1
38d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
38e0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
38f0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
3900: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3910: 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22  YLE.  { "pwrite"
3920: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3930: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3940: 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ite,     0  },.#
3950: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3960: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3970: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3980: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3990: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
39a0: 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69  sPwrite    ((ssi
39b0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
39c0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
39d0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
39f0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
3a00: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3a10: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
3a20: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
3a30: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3a40: 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20  l_ptr)pwrite64, 
3a50: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3a60: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3a70: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3a80: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3a90: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3ab0: 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  64  ((ssize_t(*)
3ac0: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3ad0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
3ae0: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
3af0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3b00: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
3b10: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3b20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3b30: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
3b40: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
3b50: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3b60: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b70: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3b80: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3b90: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3ba0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3bb0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3bc0: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3bd0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3be0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3bf0: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3c00: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3c10: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3c20: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c30: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c50: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3c60: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3c70: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3c80: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3c90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ca0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3cb0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3cc0: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3cd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3ce0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3cf0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3d00: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3d10: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3d20: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3d30: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3d40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3d50: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3d60: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3d70: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3d80: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d90: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3da0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3db0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3dc0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3dd0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3de0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3df0: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3e00: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3e10: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3e20: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3e30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3e40: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3e50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3e60: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3e70: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3e80: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3e90: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ea0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3eb0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3ec0: 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e  ined(HAVE_FCHOWN
3ed0: 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20  ).  { "fchown", 
3ee0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3ef0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f 77  yscall_ptr)fchow
3f00: 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  n,          0 },
3f10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6f  .#else.  { "fcho
3f20: 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wn",       (sqli
3f30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3f50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3f60: 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20 20  fine osFchown   
3f70: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69   ((int(*)(int,ui
3f80: 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73 63  d_t,gid_t))aSysc
3f90: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
3fa0: 29 0a 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  )..  { "geteuid"
3fb0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
3fc0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
3fd0: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
3fe0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 65  ,.#define osGete
3ff0: 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a 29  uid   ((uid_t(*)
4000: 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b  (void))aSyscall[
4010: 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  21].pCurrent)..#
4020: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4030: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
4040: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4050: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70  SIZE>0.  { "mmap
4060: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
4070: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4080: 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mmap,           
4090: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
40a0: 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20 20  "mmap",         
40b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
40c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
40d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
40e0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70  f.#define osMmap
40f0: 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64   ((void*(*)(void
4100: 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74  *,size_t,int,int
4110: 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ,int,off_t))aSys
4120: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
4130: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
4140: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
4150: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
4160: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20  MMAP_SIZE>0.  { 
4170: 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20  "munmap",       
4180: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4190: 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20  _ptr)munmap,    
41a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
41b0: 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20  .  { "munmap",  
41c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
41d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
41e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
41f0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4200: 73 4d 75 6e 6d 61 70 20 28 28 69 6e 74 28 2a 29  sMunmap ((int(*)
4210: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  (void*,size_t))a
4220: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
4230: 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f  rent)..#if HAVE_
4240: 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65 66 69  MREMAP && (!defi
4250: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4260: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
4270: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a  AX_MMAP_SIZE>0).
4280: 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20    { "mremap",   
4290: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
42a0: 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c  call_ptr)mremap,
42b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
42c0: 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70  else.  { "mremap
42d0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
42e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4300: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
4310: 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f  ne osMremap ((vo
4320: 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a  id*(*)(void*,siz
4330: 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e  e_t,size_t,int,.
4340: 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d  ..))aSyscall[24]
4350: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4360: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4370: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
4380: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
4390: 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61 67 65  E>0.  { "getpage
43a0: 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33  size",  (sqlite3
43b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 69  _syscall_ptr)uni
43c0: 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20 30 20  xGetpagesize, 0 
43d0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67 65  },.#else.  { "ge
43e0: 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71  tpagesize",  (sq
43f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4400: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
4410: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
4420: 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61 67 65  define osGetpage
4430: 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28 76 6f  size ((int(*)(vo
4440: 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d  id))aSyscall[25]
4450: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4460: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
4470: 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65 61 64  DLINK).  { "read
4480: 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69  link",     (sqli
4490: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
44a0: 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20  readlink,       
44b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
44c0: 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20  "readlink",     
44d0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
44e0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
44f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4500: 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  f.#define osRead
4510: 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28 2a  link ((ssize_t(*
4520: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 68  )(const char*,ch
4530: 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  ar*,size_t))aSys
4540: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
4550: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4560: 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 7b 20  HAVE_LSTAT).  { 
4570: 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "lstat",        
4580: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4590: 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20 20 20  l_ptr)lstat,    
45a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
45b0: 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20 20 20  .  { "lstat",   
45c0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
45d0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
45e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
45f0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4600: 73 4c 73 74 61 74 20 20 20 20 20 20 28 28 69 6e  sLstat      ((in
4610: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
4620: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
4630: 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72  Syscall[27].pCur
4640: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4650: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26  ed(__linux__) &&
4660: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4670: 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f  ENABLE_BATCH_ATO
4680: 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 7b 20 22  MIC_WRITE).  { "
4690: 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20  ioctl",         
46a0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
46b0: 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20 20 20 20  _ptr)ioctl,     
46c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
46d0: 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20 20 20    { "ioctl",    
46e0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
46f0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
4700: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4710: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
4720: 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29 28 69  Ioctl ((int(*)(i
4730: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
4740: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
4750: 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  t)..}; /* End of
4760: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
4770: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
4780: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d  /.../*.** On som
4790: 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73  e systems, calls
47a0: 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c   to fchown() wil
47b0: 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73 73  l trigger a mess
47c0: 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69 74  age in a securit
47d0: 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79  y.** log if they
47e0: 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72   come from non-r
47f0: 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20  oot processes.  
4800: 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67  So avoid calling
4810: 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20   fchown() if.** 
4820: 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69  we are not runni
4830: 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73  ng as root..*/.s
4840: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4850: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
4860: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
4870: 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  gid){.#if define
4880: 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20  d(HAVE_FCHOWN). 
4890: 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75 69   return osGeteui
48a0: 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f  d() ? 0 : osFcho
48b0: 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a  wn(fd,uid,gid);.
48c0: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
48d0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
48e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
48f0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
4900: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
4910: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
4920: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
4930: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
4940: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
4950: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
4960: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
4970: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
4980: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
4990: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
49a0: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
49b0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
49c0: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
49d0: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
49e0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
49f0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
4a00: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
4a10: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
4a20: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
4a30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
4a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4a50: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
4a60: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
4a70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
4a80: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
4a90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
4aa0: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
4ab0: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
4ac0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
4ad0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
4ae0: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
4af0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
4b00: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
4b10: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
4b20: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
4b30: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
4b40: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
4b50: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
4b60: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
4b70: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
4b80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
4b90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4ba0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4bb0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4bc0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4bd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4be0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4bf0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
4c00: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4c10: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
4c20: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
4c30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
4c40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
4c50: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
4c60: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
4c70: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
4c80: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
4c90: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
4ca0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
4cb0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4cc0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4cd0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
4ce0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4cf0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4d00: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
4d10: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
4d20: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
4d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
4d40: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4d50: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4d60: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
4d70: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
4d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4d90: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
4da0: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
4db0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4dc0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
4dd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4de0: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
4df0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4e10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4e20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4e30: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
4e40: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
4e50: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
4e60: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
4e70: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
4e80: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
4e90: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
4ea0: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
4eb0: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
4ec0: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
4ed0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
4ee0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
4ef0: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
4f00: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
4f10: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
4f20: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
4f30: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
4f40: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4f50: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
4f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4f70: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4f80: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4f90: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
4fa0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4fb0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4fc0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
4fd0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4fe0: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
4ff0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
5000: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
5010: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
5020: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
5030: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
5040: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
5050: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
5060: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
5070: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
5080: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
5090: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
50a0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
50b0: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
50c0: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
50d0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
50e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
50f0: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
5100: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
5110: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
5120: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
5130: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
5140: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
5150: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
5160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
5170: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
5180: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
5190: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
51a0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
51b0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
51c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
51d0: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
51e0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
51f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
5200: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
5210: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
5220: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
5230: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5240: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  }../*.** Do not 
5250: 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20  accept any file 
5260: 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20  descriptor less 
5270: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
5280: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
5290: 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61  id.** opening da
52a0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e  tabase file usin
52b0: 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  g file descripto
52c0: 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  rs that are comm
52d0: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a  only used for .*
52e0: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
52f0: 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72  , output, and er
5300: 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ror..*/.#ifndef 
5310: 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46  SQLITE_MINIMUM_F
5320: 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23  ILE_DESCRIPTOR.#
5330: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d   define SQLITE_M
5340: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
5350: 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a  RIPTOR 3.#endif.
5360: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70  ./*.** Invoke op
5370: 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c  en().  Do so mul
5380: 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74  tiple times, unt
5390: 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63  il it either suc
53a0: 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c  ceeds or.** fail
53b0: 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f  s for some reaso
53c0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e  n other than EIN
53d0: 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  TR..**.** If the
53e0: 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d   file creation m
53f0: 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65  ode "m" is 0 the
5400: 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  n set it to the 
5410: 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53  default for.** S
5420: 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61  QLite.  The defa
5430: 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45  ult is SQLITE_DE
5440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
5450: 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79  SSIONS (normally
5460: 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64  .** 0644) as mod
5470: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73  ified by the sys
5480: 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d  tem umask.  If m
5490: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a   is not 0, then.
54a0: 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
54b0: 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62   creation mode b
54c0: 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f  e exactly m igno
54d0: 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a  ring the umask..
54e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61  **.** The m para
54f0: 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f  meter will be no
5500: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e  n-zero only when
5510: 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20   creating -wal, 
5520: 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64  -journal,.** and
5530: 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65   -shm files.  We
5540: 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65   want those file
5550: 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74  s to have *exact
5560: 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  ly* the same.** 
5570: 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74  permissions as t
5580: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
5590: 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65  tabase, unadulte
55a0: 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  rated by the uma
55b0: 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77  sk..** In that w
55c0: 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73  ay, if a databas
55d0: 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77  e file is -rw-rw
55e0: 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d  -rw or -rw-rw-r-
55f0: 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73  , and a.** trans
5600: 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61  action crashes a
5610: 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64  nd leaves behind
5620: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   hot journals, t
5630: 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65  hen any.** proce
5640: 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20  ss that is able 
5650: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
5660: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c  database will al
5670: 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a  so be able to.**
5680: 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74   recover the hot
5690: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74   journals..*/.st
56a0: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
56b0: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
56c0: 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f  *z, int f, mode_
56d0: 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  t m){.  int fd;.
56e0: 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20    mode_t m2 = m 
56f0: 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46  ? m : SQLITE_DEF
5700: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
5710: 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31  SIONS;.  while(1
5720: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ){.#if defined(O
5730: 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64  _CLOEXEC).    fd
5740: 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f   = osOpen(z,f|O_
5750: 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c  CLOEXEC,m2);.#el
5760: 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  se.    fd = osOp
5770: 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64  en(z,f,m2);.#end
5780: 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  if.    if( fd<0 
5790: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
57a0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74  no==EINTR ) cont
57b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61  inue;.      brea
57c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
57d0: 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49   fd>=SQLITE_MINI
57e0: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
57f0: 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  TOR ) break;.   
5800: 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20   osClose(fd);.  
5810: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
5820: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20  LITE_WARNING, . 
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
5840: 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  attempt to open 
5850: 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64  \"%s\" as file d
5860: 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a  escriptor %d", z
5870: 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20  , fd);.    fd = 
5880: 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70  -1;.    if( osOp
5890: 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20  en("/dev/null", 
58a0: 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b  f, m)<0 ) break;
58b0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30  .  }.  if( fd>=0
58c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30   ){.    if( m!=0
58d0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
58e0: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
58f0: 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
5900: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d  (fd, &statbuf)==
5910: 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61  0 .       && sta
5920: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a  tbuf.st_size==0.
5930: 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62         && (statb
5940: 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  uf.st_mode&0777)
5950: 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  !=m .      ){.  
5960: 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66        osFchmod(f
5970: 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, m);.      }. 
5980: 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64     }.#if defined
5990: 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20  (FD_CLOEXEC) && 
59a0: 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45  (!defined(O_CLOE
59b0: 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45  XEC) || O_CLOEXE
59c0: 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74  C==0).    osFcnt
59d0: 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
59e0: 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
59f0: 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
5a00: 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  XEC);.#endif.  }
5a10: 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a  .  return fd;.}.
5a20: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
5a30: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
5a40: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
5a50: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5a60: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
5a70: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
5a80: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e  o protect the un
5a90: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a  ixInodeInfo and.
5aa0: 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ** vxworksFileId
5ab0: 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
5ac0: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
5ad0: 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
5ae0: 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75  .** shared by mu
5af0: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
5b00: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75  **.** Function u
5b10: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
5b20: 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
5b30: 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
5b40: 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
5b50: 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
5b60: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
5b70: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
5b80: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
5b90: 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
5ba0: 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
5bb0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
5bc0: 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
5bd0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
5be0: 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  );.**   unixEnte
5bf0: 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74  rLeave().*/.stat
5c00: 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65  ic void unixEnte
5c10: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
5c20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
5c30: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
5c40: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
5c50: 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29  EX_STATIC_VFS1))
5c60: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
5c70: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76  unixLeaveMutex(v
5c80: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
5c90: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
5ca0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
5cb0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5cc0: 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64  C_VFS1));.}.#ifd
5cd0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5ce0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
5cf0: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
5d00: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5d10: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
5d20: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
5d30: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
5d40: 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e  IC_VFS1));.}.#en
5d50: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  dif...#ifdef SQL
5d60: 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
5d70: 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  E./*.** Helper f
5d80: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e  unction for prin
5d90: 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69  ting out trace i
5da0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
5db0: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e  debugging.** bin
5dc0: 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75  aries. This retu
5dd0: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72  rns the string r
5de0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
5df0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
5e00: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
5e10: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
5e20: 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65  nst char *azFile
5e30: 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f  Lock(int eFileLo
5e40: 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65  ck){.  switch( e
5e50: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
5e60: 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65  case NO_LOCK: re
5e70: 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20  turn "NONE";.   
5e80: 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43   case SHARED_LOC
5e90: 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45  K: return "SHARE
5ea0: 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  D";.    case RES
5eb0: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
5ec0: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
5ed0: 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f     case PENDING_
5ee0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45  LOCK: return "PE
5ef0: 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65  NDING";.    case
5f00: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
5f10: 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49   return "EXCLUSI
5f20: 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VE";.  }.  retur
5f30: 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e  n "ERROR";.}.#en
5f40: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
5f50: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a  TE_LOCK_TRACE./*
5f60: 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e  .** Print out in
5f70: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
5f80: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  all locking oper
5f90: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
5fa0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5fb0: 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  ed for troublesh
5fc0: 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ooting locks on 
5fd0: 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a  multithreaded.**
5fe0: 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61   platforms.  Ena
5ff0: 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ble by compiling
6000: 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49   with the -DSQLI
6010: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a  TE_LOCK_TRACE.**
6020: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
6030: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70  tion on the comp
6040: 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65  iler.  This code
6050: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20   is normally.** 
6060: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
6070: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72  tatic int lockTr
6080: 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ace(int fd, int 
6090: 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  op, struct flock
60a0: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f   *p){.  char *zO
60b0: 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20  pName, *zType;. 
60c0: 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61   int s;.  int sa
60d0: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  vedErrno;.  if( 
60e0: 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20  op==F_GETLK ){. 
60f0: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45     zOpName = "GE
6100: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TLK";.  }else if
6110: 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b  ( op==F_SETLK ){
6120: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
6130: 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  SETLK";.  }else{
6140: 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c  .    s = osFcntl
6150: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20  (fd, op, p);.   
6160: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
6170: 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f  ntf("fcntl unkno
6180: 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  wn %d %d %d\n", 
6190: 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20  fd, op, s);.    
61a0: 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20  return s;.  }.  
61b0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
61c0: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _RDLCK ){.    zT
61d0: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
61e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
61f0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
6200: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52  .    zType = "WR
6210: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
6220: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( p->l_type==F_U
6230: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  NLCK ){.    zTyp
6240: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d  e = "UNLCK";.  }
6250: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6260: 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ( 0 );.  }.  ass
6270: 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65  ert( p->l_whence
6280: 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20  ==SEEK_SET );.  
6290: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
62a0: 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45  op, p);.  savedE
62b0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
62c0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
62d0: 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20  tf("fcntl %d %d 
62e0: 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25  %s %s %d %d %d %
62f0: 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61  d\n",.     threa
6300: 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65  did, fd, zOpName
6310: 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d  , zType, (int)p-
6320: 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70  >l_start, (int)p
6330: 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69  ->l_len,.     (i
6340: 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b  nt)p->l_pid, s);
6350: 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26  .  if( s==(-1) &
6360: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
6370: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
6380: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
6390: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
63a0: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
63b0: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
63c0: 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c  .    osFcntl(fd,
63d0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
63e0: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
63f0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
6400: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
6410: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
6420: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
6430: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
6440: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
6450: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
6460: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
6470: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
6480: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
6490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
64a0: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
64b0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
64c0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
64d0: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
64e0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
64f0: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
6500: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
6510: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
6520: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
6530: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
6540: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
6550: 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74  .}.#undef osFcnt
6560: 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  l.#define osFcnt
6570: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
6580: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
6590: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  K_TRACE */../*.*
65a0: 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74  * Retry ftruncat
65b0: 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  e() calls that f
65c0: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
65d0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73  .**.** All calls
65e0: 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20   to ftruncate() 
65f0: 77 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65  within this file
6600: 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20   should be made 
6610: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20  through.** this 
6620: 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74 68 65  wrapper.  On the
6630: 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72   Android platfor
6640: 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65  m, bypassing the
6650: 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20   logic below.** 
6660: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
6670: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6690: 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
66a0: 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f  (int h, sqlite3_
66b0: 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74  int64 sz){.  int
66c0: 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e   rc;.#ifdef __AN
66d0: 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  DROID__.  /* On 
66e0: 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61  Android, ftrunca
66f0: 74 65 28 29 20 61 6c 77 61 79 73 20 75 73 65 73  te() always uses
6700: 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c   32-bit offsets,
6710: 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f   even if .  ** _
6720: 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53  FILE_OFFSET_BITS
6730: 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20  =64 is defined. 
6740: 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73  This means it is
6750: 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d   unsafe to attem
6760: 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63  pt to.  ** trunc
6770: 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e  ate a file to an
6780: 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68  y size larger th
6790: 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c  an 2GiB. Silentl
67a0: 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a  y ignore any.  *
67b0: 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e  * such attempts.
67c0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73    */.  if( sz>(s
67d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37  qlite3_int64)0x7
67e0: 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72  FFFFFFF ){.    r
67f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6800: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
6810: 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e  do{ rc = osFtrun
6820: 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69  cate(h,sz); }whi
6830: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
6840: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
6850: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6860: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74  * This routine t
6870: 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e  ranslates a stan
6880: 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f  dard POSIX errno
6890: 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74   code into somet
68a0: 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74  hing.** useful t
68b0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66  o the clients of
68c0: 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e   the sqlite3 fun
68d0: 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69  ctions.  Specifi
68e0: 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20  cally, it is.** 
68f0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e  intended to tran
6900: 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20  slate a variety 
6910: 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65  of "try again" e
6920: 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54  rrors into SQLIT
6930: 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20  E_BUSY.** and a 
6940: 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61  variety of "plea
6950: 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  se close the fil
6960: 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57  e descriptor NOW
6970: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a  " errors into .*
6980: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a  * SQLITE_IOERR.*
6990: 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72  * .** Errors dur
69a0: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ing initializati
69b0: 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20  on of locks, or 
69c0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
69d0: 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a  ort for locks,.*
69e0: 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20  * should handle 
69f0: 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c  ENOLCK, ENOTSUP,
6a00: 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61   EOPNOTSUPP sepa
6a10: 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rately..*/.stati
6a20: 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f  c int sqliteErro
6a30: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
6a40: 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20  int posixError, 
6a50: 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29  int sqliteIOErr)
6a60: 20 7b 0a 20 20 61 73 73 65 72 74 28 20 28 73 71   {.  assert( (sq
6a70: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
6a80: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20  ITE_IOERR_LOCK) 
6a90: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73  || .          (s
6aa0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
6ab0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
6ac0: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  K) || .         
6ad0: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
6ae0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
6af0: 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20  LOCK) ||.       
6b00: 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20     (sqliteIOErr 
6b10: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
6b20: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
6b30: 4b 29 20 29 3b 0a 20 20 73 77 69 74 63 68 20 28  K) );.  switch (
6b40: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20  posixError) {.  
6b50: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
6b60: 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63  case EAGAIN:.  c
6b70: 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20  ase ETIMEDOUT:. 
6b80: 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63   case EBUSY:.  c
6b90: 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73  ase EINTR:.  cas
6ba0: 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20  e ENOLCK:  .    
6bb0: 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65  /* random NFS re
6bc0: 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73  try error, unles
6bd0: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
6be0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
6bf0: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
6c00: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
6c10: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
6c20: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20  hat it says */. 
6c30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6c40: 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61  _BUSY;.    .  ca
6c50: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
6c60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
6c70: 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c  M;.    .  defaul
6c80: 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73  t: .    return s
6c90: 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a  qliteIOErr;.  }.
6ca0: 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cf0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
6d00: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69  ****** Begin Uni
6d10: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
6d20: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
6d30: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
6d40: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73  ***.**.** On mos
6d50: 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e  t versions of un
6d60: 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61  ix, we can get a
6d70: 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61   unique ID for a
6d80: 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65   file by concate
6d90: 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65  nating.** the de
6da0: 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  vice number and 
6db0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
6dc0: 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73  .  But this does
6dd0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
6de0: 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f  orks..** On VxWo
6df0: 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69  rks, a unique fi
6e00: 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61  le id must be ba
6e10: 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e  sed on the canon
6e20: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a  ical filename..*
6e30: 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
6e40: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
6e50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
6e60: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
6e70: 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69  used as a.** uni
6e80: 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56  que file ID in V
6e90: 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e  xWorks.  Each in
6ea0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
6eb0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
6ec0: 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74  s.** a copy of t
6ed0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
6ee0: 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73  ename.  There is
6ef0: 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63   also a referenc
6f00: 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68  e count.  .** Th
6f10: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  e structure is r
6f20: 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68  eclaimed when th
6f30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  e number of poin
6f40: 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73  ters to it drops
6f50: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a   to.** zero..**.
6f60: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76  ** There are nev
6f70: 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c  er very many fil
6f80: 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74  es open at one t
6f90: 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20  ime and lookups 
6fa0: 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72  are not.** a per
6fb0: 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61  formance-critica
6fc0: 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73  l path, so it is
6fd0: 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70   sufficient to p
6fe0: 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75  ut these.** stru
6ff0: 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b  ctures on a link
7000: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ed list..*/.stru
7010: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7020: 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f   {.  struct vxwo
7030: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74  rksFileId *pNext
7040: 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20  ;  /* Next in a 
7050: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
7060: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7090: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
70a0: 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74  his one */.  int
70b0: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
70c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
70d0: 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e  ngth of the zCan
70e0: 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72  onicalName[] str
70f0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ing */.  char *z
7100: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20  CanonicalName;  
7110: 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69         /* Canoni
7120: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  cal filename */.
7130: 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  };..#if OS_VXWOR
7140: 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e  KS./* .** All un
7150: 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  ique filenames a
7160: 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e  re held on a lin
7170: 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20  ked list headed 
7180: 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  by this.** varia
7190: 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ble:.*/.static s
71a0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
71b0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65  eId *vxworksFile
71c0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
71d0: 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65   Simplify a file
71e0: 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61  name into its ca
71f0: 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20  nonical form.** 
7200: 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f  by making the fo
7210: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a  llowing changes:
7220: 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69  .**.**  * removi
7230: 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ng any trailing 
7240: 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a  and duplicate /.
7250: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e  **  * convert /.
7260: 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  / into just /.**
7270: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e    * convert /A/.
7280: 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e  ./ where A is an
7290: 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e  y simple name in
72a0: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20  to just /.**.** 
72b0: 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  Changes are made
72c0: 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75   in-place.  Retu
72d0: 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20  rn the new name 
72e0: 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  length..**.** Th
72f0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e  e original filen
7300: 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e  ame is in z[0..n
7310: 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  -1].  Return the
7320: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68   number of.** ch
7330: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
7340: 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e  simplified name.
7350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
7360: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
7370: 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  me(char *z, int 
7380: 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  n){.  int i, j;.
7390: 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
73a0: 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e  z[n-1]=='/' ){ n
73b0: 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  --; }.  for(i=j=
73c0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
73d0: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20    if( z[i]=='/' 
73e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
73f0: 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69  +1]=='/' ) conti
7400: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  nue;.      if( z
7410: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b  [i+1]=='.' && i+
7420: 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27  2<n && z[i+2]=='
7430: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  /' ){.        i 
7440: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 1;.        co
7450: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
7460: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
7470: 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26  =='.' && i+3<n &
7480: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26  & z[i+2]=='.' &&
7490: 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+3]=='/' ){.
74a0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
74b0: 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f  >0 && z[j-1]!='/
74c0: 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ j--; }.    
74d0: 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a      if( j>0 ){ j
74e0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20  --; }.        i 
74f0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 2;.        co
7500: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
7510: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d      }.    z[j++]
7520: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a   = z[i];.  }.  z
7530: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [j] = 0;.  retur
7540: 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n j;.}../*.** Fi
7550: 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  nd a unique file
7560: 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65   ID for the give
7570: 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e  n absolute pathn
7580: 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ame.  Return.** 
7590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
75a0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
75b0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69  bject.  This poi
75c0: 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71  nter is the uniq
75d0: 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a  ue.** file ID..*
75e0: 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69  *.** The nRef fi
75f0: 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72  eld of the vxwor
7600: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
7610: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
7620: 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a  efore.** the obj
7630: 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ect is returned.
7640: 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46    A new vxworksF
7650: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
7660: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61  created.** and a
7670: 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62  dded to the glob
7680: 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73  al list if neces
7690: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sary..**.** If a
76a0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
76b0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
76c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
76d0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
76e0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
76f0: 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
7700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73  const char *zAbs
7710: 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74  oluteName){.  st
7720: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7730: 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  Id *pNew;       
7740: 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20    /* search key 
7750: 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20  and new file ID 
7760: 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  */.  struct vxwo
7770: 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64  rksFileId *pCand
7780: 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20  idate;   /* For 
7790: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69  looping over exi
77a0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a  sting file IDs *
77b0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
77e0: 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61  h of zAbsoluteNa
77f0: 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20  me string */..  
7800: 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74  assert( zAbsolut
7810: 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  eName[0]=='/' );
7820: 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  .  n = (int)strl
7830: 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  en(zAbsoluteName
7840: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
7850: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
7860: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e  zeof(*pNew) + (n
7870: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  +1) );.  if( pNe
7880: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7890: 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  .  pNew->zCanoni
78a0: 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  calName = (char*
78b0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d  )&pNew[1];.  mem
78c0: 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  cpy(pNew->zCanon
78d0: 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c  icalName, zAbsol
78e0: 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20  uteName, n+1);. 
78f0: 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70   n = vxworksSimp
7900: 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a  lifyName(pNew->z
7910: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
7920: 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  );..  /* Search 
7930: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
7940: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
7950: 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61  ing the canonica
7960: 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20  l name..  ** If 
7970: 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  found, increment
7980: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
7990: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
79a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a  a pointer to.  *
79b0: 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66  * the existing f
79c0: 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75  ile ID..  */.  u
79d0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
79e0: 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74  .  for(pCandidat
79f0: 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  e=vxworksFileLis
7a00: 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70  t; pCandidate; p
7a10: 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69  Candidate=pCandi
7a20: 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  date->pNext){.  
7a30: 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65    if( pCandidate
7a40: 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20  ->nName==n .    
7a50: 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64   && memcmp(pCand
7a60: 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61  idate->zCanonica
7a70: 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61  lName, pNew->zCa
7a80: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d  nonicalName, n)=
7a90: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
7aa0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
7ab0: 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e  ew);.       pCan
7ac0: 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  didate->nRef++;.
7ad0: 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
7ae0: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
7af0: 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74  return pCandidat
7b00: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  e;.    }.  }..  
7b10: 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20  /* No match was 
7b20: 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20  found.  We will 
7b30: 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20  make a new file 
7b40: 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52  ID */.  pNew->nR
7b50: 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e  ef = 1;.  pNew->
7b60: 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65  nName = n;.  pNe
7b70: 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72  w->pNext = vxwor
7b80: 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78  ksFileList;.  vx
7b90: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
7ba0: 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76  pNew;.  unixLeav
7bb0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
7bc0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7bd0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
7be0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7bf0: 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65  on a vxworksFile
7c00: 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65  Id object.  Free
7c10: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77  .** the object w
7c20: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
7c30: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
7c40: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
7c50: 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65  void vxworksRele
7c60: 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74  aseFileId(struct
7c70: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
7c80: 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65  pId){.  unixEnte
7c90: 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
7ca0: 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20  rt( pId->nRef>0 
7cb0: 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d  );.  pId->nRef--
7cc0: 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65  ;.  if( pId->nRe
7cd0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  f==0 ){.    stru
7ce0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7cf0: 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70   **pp;.    for(p
7d00: 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  p=&vxworksFileLi
7d10: 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d  st; *pp && *pp!=
7d20: 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70  pId; pp = &((*pp
7d30: 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20  )->pNext)){}.   
7d40: 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49   assert( *pp==pI
7d50: 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  d );.    *pp = p
7d60: 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  Id->pNext;.    s
7d70: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29  qlite3_free(pId)
7d80: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
7d90: 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64  eMutex();.}.#end
7da0: 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
7db0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
7dc0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71  **** End of Uniq
7dd0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
7de0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
7df0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
7e00: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
7e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e50: 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
7e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ea0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
7eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ec0: 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79  * Posix Advisory
7ed0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
7ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ef0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49  *****.**.** POSI
7f00: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
7f10: 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64   are broken by d
7f20: 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44  esign.  ANSI STD
7f30: 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a   1003.1 (1996).*
7f40: 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e  * section 6.5.2.
7f50: 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f  2 lines 483 thro
7f60: 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20  ugh 490 specify 
7f70: 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63  that when a proc
7f80: 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63  ess.** sets or c
7f90: 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68  lears a lock, th
7fa0: 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65  at operation ove
7fb0: 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72  rrides any prior
7fc0: 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79   locks set.** by
7fd0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7fe0: 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  s.  It does not 
7ff0: 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73  explicitly say s
8000: 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c  o, but this impl
8010: 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f  ies.** that it o
8020: 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73  verrides locks s
8030: 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  et by the same p
8040: 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64  rocess using a d
8050: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
8060: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f   descriptor.  Co
8070: 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74  nsider this test
8080: 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   case:.**.**    
8090: 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65     int fd1 = ope
80a0: 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52  n("./file1", O_R
80b0: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
80c0: 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  4);.**       int
80d0: 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd2 = open("./f
80e0: 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile2", O_RDWR|O_
80f0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
8100: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69  .** Suppose ./fi
8110: 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20  le1 and ./file2 
8120: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73  are really the s
8130: 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ame file (becaus
8140: 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61  e.** one is a ha
8150: 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c  rd or symbolic l
8160: 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72  ink to the other
8170: 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65  ) then if you se
8180: 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76  t.** an exclusiv
8190: 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74  e lock on fd1, t
81a0: 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61  hen try to get a
81b0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
81c0: 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77  .** on fd2, it w
81d0: 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68  orks.  I would h
81e0: 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65  ave expected the
81f0: 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a   second lock to.
8200: 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68  ** fail since th
8210: 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  ere was already 
8220: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
8230: 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a  le due to fd1..*
8240: 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53  * But not so.  S
8250: 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20  ince both locks 
8260: 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61  came from the sa
8270: 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a  me process, the.
8280: 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69  ** second overri
8290: 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65  des the first, e
82a0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
82b0: 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e  were on differen
82c0: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
82d0: 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20  ptors opened on 
82e0: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e  different file n
82f0: 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ames..**.** This
8300: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63   means that we c
8310: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
8320: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
8330: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
8340: 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74  .** among compet
8350: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
8360: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
8370: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
8380: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
8390: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
83a0: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
83b0: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
83c0: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
83d0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
83e0: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
83f0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
8400: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
8410: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
8420: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
8430: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
8440: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
8450: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
8460: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
8470: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
8480: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
8490: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
84a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
84b0: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
84c0: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
84d0: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
84e0: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
84f0: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
8500: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
8510: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
8520: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
8530: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
8540: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
8550: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
8560: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
8570: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
8580: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
8590: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
85a0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
85b0: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
85c0: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
85d0: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
85e0: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
85f0: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
8600: 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73  * (Aside: The us
8610: 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65  e of inode numbe
8620: 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73  rs as unique IDs
8630: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
8640: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f  n VxWorks..** Fo
8650: 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61  r VxWorks, we ha
8660: 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c  ve to use the al
8670: 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65  ternative unique
8680: 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64   ID system based
8690: 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c   on.** canonical
86a0: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d   filename and im
86b0: 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65  plemented in the
86c0: 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69   previous divisi
86d0: 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  on.).**.** The s
86e0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
86f0: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20  cture for POSIX 
8700: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73  is no longer jus
8710: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c  t an integer fil
8720: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e  e.** descriptor.
8730: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74    It is now a st
8740: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c  ructure that hol
8750: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66  ds the integer f
8760: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
8770: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  r and a pointer 
8780: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74  to a structure t
8790: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
87a0: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f  e internal.** lo
87b0: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  cks on the corre
87c0: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20  sponding inode. 
87d0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f   There is one lo
87e0: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a  cking structure.
87f0: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f  ** per inode, so
8800: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   if the same ino
8810: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69  de is opened twi
8820: 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c  ce, both unixFil
8830: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
8840: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
8850: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
8860: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
8870: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
8880: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
8890: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
88a0: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
88b0: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
88c0: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
88d0: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
88e0: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
88f0: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
8900: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
8910: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
8920: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
8930: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
8940: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
8950: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
8960: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
8970: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
8980: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
8990: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
89a0: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
89b0: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
89c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
89d0: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
89e0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
89f0: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
8a00: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
8a10: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
8a20: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
8a30: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
8a40: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
8a50: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
8a60: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
8a70: 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74  .** But wait:  t
8a80: 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72  here are yet mor
8a90: 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  e problems with 
8aa0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
8ab0: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79  ocks..**.** If y
8ac0: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20  ou close a file 
8ad0: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
8ae0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65  points to a file
8af0: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c   that has locks,
8b00: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e  .** all locks on
8b10: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
8b20: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65  are owned by the
8b30: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
8b40: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64   are.** released
8b50: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
8b60: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20  d this problem, 
8b70: 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e  each unixInodeIn
8b80: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69  fo object.** mai
8b90: 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f  ntains a count o
8ba0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
8bb0: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  pending locks on
8bc0: 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57   tha inode..** W
8bd0: 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
8be0: 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20  s made to close 
8bf0: 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20  an unixFile, if 
8c00: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68  there are.** oth
8c10: 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e  er unixFile open
8c20: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   on the same ino
8c30: 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64  de that are hold
8c40: 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63  ing locks, the c
8c50: 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28  all.** to close(
8c60: 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  ) the file descr
8c70: 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65  iptor is deferre
8c80: 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74  d until all of t
8c90: 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a  he locks clear..
8ca0: 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65  ** The unixInode
8cb0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b  Info structure k
8cc0: 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66  eeps a list of f
8cd0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
8ce0: 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20  that need to.** 
8cf0: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68  be closed and th
8d00: 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65  at list is walke
8d10: 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20  d (and cleared) 
8d20: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
8d30: 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a  ck.** clears..**
8d40: 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20  .** Yet another 
8d50: 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54  problem:  LinuxT
8d60: 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c  hreads do not pl
8d70: 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73  ay well with pos
8d80: 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ix locks..**.** 
8d90: 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69  Many older versi
8da0: 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65  ons of linux use
8db0: 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64   the LinuxThread
8dc0: 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20  s library which 
8dd0: 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20  is.** not posix 
8de0: 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65  compliant.  Unde
8df0: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  r LinuxThreads, 
8e00: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
8e10: 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61  y thread.** A ca
8e20: 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64  nnot be modified
8e30: 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62   or overridden b
8e40: 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  y a different th
8e50: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20  read B..** Only 
8e60: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64  thread A can mod
8e70: 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c  ify the lock.  L
8e80: 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20  ocking behavior 
8e90: 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66  is correct.** if
8ea0: 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20   the appliation 
8eb0: 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e  uses the newer N
8ec0: 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65  ative Posix Thre
8ed0: 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c  ad Library (NPTL
8ee0: 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20  ).** on linux - 
8ef0: 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b  with NPTL a lock
8f00: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
8f10: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
8f20: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68  e locks.** in th
8f30: 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65  read B.  But the
8f40: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
8f50: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
8f60: 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68  time which.** th
8f70: 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20  reading library 
8f80: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
8f90: 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  So there is no w
8fa0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a  ay to know at.**
8fb0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
8fc0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
8fd0: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
8fe0: 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65  de locks on thre
8ff0: 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73  ad B..** One has
9000: 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d   to do a run-tim
9010: 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f  e check to disco
9020: 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72  ver the behavior
9030: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   of the.** curre
9040: 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  nt process..**.*
9050: 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f  * SQLite used to
9060: 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68   support LinuxTh
9070: 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70  reads.  But supp
9080: 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72  ort for LinuxThr
9090: 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70  eads.** was drop
90a0: 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ped beginning wi
90b0: 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30  th version 3.7.0
90c0: 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73  .  SQLite will s
90d0: 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a  till work with.*
90e0: 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70  * LinuxThreads p
90f0: 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29  rovided that (1)
9100: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72   there is no mor
9110: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65  e than one conne
9120: 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61  ction .** per da
9130: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
9140: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
9150: 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65  and (2) database
9160: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
9170: 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f  do not move acro
9180: 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a  ss threads..*/..
9190: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
91a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
91b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
91c0: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
91d0: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
91e0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e   a particular un
91f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
9200: 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ct..*/.struct un
9210: 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76  ixFileId {.  dev
9220: 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20  _t dev;         
9230: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
9240: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  ce number */.#if
9250: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
9260: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
9270: 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69  Id *pId;  /* Uni
9280: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
9290: 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73  vxworks. */.#els
92a0: 65 0a 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f  e.  /* We are to
92b0: 6c 64 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  ld that some ver
92c0: 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72 6f 69 64  sions of Android
92d0: 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 20 74   contain a bug t
92e0: 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65 73 20 69  hat.  ** sizes i
92f0: 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20 33 32 2d  no_t at only 32-
9300: 62 69 74 73 20 69 6e 73 74 65 61 64 20 6f 66 20  bits instead of 
9310: 36 34 2d 62 69 74 73 2e 20 28 53 65 65 0a 20 20  64-bits. (See.  
9320: 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e 64 72 6f  ** https://andro
9330: 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f 67 6c 65  id-review.google
9340: 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f 63 2f 31  source.com/#/c/1
9350: 31 35 33 35 31 2f 33 2f 64 69 73 74 2f 73 71 6c  15351/3/dist/sql
9360: 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20 54 6f 20  ite3.c).  ** To 
9370: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
9380: 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74  , always allocat
9390: 65 20 36 34 2d 62 69 74 73 20 66 6f 72 20 74 68  e 64-bits for th
93a0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
93b0: 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61 6c 6c 20   .  ** On small 
93c0: 6d 61 63 68 69 6e 65 73 20 74 68 61 74 20 6f 6e  machines that on
93d0: 6c 79 20 68 61 76 65 20 33 32 2d 62 69 74 20 69  ly have 32-bit i
93e0: 6e 6f 64 65 73 2c 20 74 68 69 73 20 77 61 73 74  nodes, this wast
93f0: 65 73 20 34 20 62 79 74 65 73 2c 0a 20 20 2a 2a  es 4 bytes,.  **
9400: 20 62 75 74 20 74 68 61 74 20 73 68 6f 75 6c 64   but that should
9410: 20 6e 6f 74 20 62 65 20 61 20 62 69 67 20 64 65   not be a big de
9420: 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57 41 53 3a  al. */.  /* WAS:
9430: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2a    ino_t ino;   *
9440: 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20 20 20 20  /.  u64 ino;    
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9460: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
9470: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
9480: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
9490: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
94a0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
94b0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
94c0: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
94d0: 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65  Or, on LinuxThre
94e0: 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  ads, there is on
94f0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  e of these struc
9500: 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63  tures for.** eac
9510: 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62  h inode opened b
9520: 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a  y each thread..*
9530: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
9540: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
9550: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
9560: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
9570: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
9580: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
9590: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
95a0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
95b0: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
95c0: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
95d0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
95e0: 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c  umber of unixFil
95f0: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  e pointing to it
9600: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
9610: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
9620: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
9630: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
9640: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
9650: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
9660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9670: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9680: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
9690: 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  eld */.  unsigne
96a0: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
96b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
96c0: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
96d0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
96e0: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
96f0: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
9700: 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ck;     /* An ex
9710: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
9720: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
9730: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
9760: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
9770: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
9780: 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
9790: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
97a0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
97b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
97c0: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
97d0: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
9800: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
9810: 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  cks */.  UnixUnu
9820: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
9830: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
9840: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
9850: 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  ors to close */.
9860: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9870: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
9880: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
9890: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
98a0: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78  bjects */.  unix
98b0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
98c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  ;           /*  
98d0: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
98e0: 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49  nked */.#if SQLI
98f0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
9900: 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e  G_STYLE.  unsign
9910: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
9920: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
9930: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
9940: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
9950: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
9960: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
9970: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9980: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
9990: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
99a0: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
99b0: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
99c0: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
99d0: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
99e0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
99f0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
9a00: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
9a10: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
9a20: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
9a30: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 20  *inodeList = 0; 
9a40: 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49 6e 6f 64   /* All unixInod
9a50: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
9a60: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
9a70: 20 69 6e 74 20 6e 55 6e 75 73 65 64 46 64 20 3d   int nUnusedFd =
9a80: 20 30 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20   0;    /* Total 
9a90: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
9aa0: 72 69 70 74 6f 72 73 20 2a 2f 0a 0a 2f 2a 0a 2a  riptors */../*.*
9ab0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9ac0: 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  on - unixLogErro
9ad0: 72 41 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e  rAtLine(), is on
9ae0: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
9af0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
9b00: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a  unixLogError()..
9b10: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
9b20: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
9b30: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
9b40: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  OS function and 
9b50: 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a  errno has been.*
9b60: 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61  * set. It logs a
9b70: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
9b80: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
9b90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
9ba0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
9bb0: 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f  errno and, if po
9bc0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
9bd0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
9be0: 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72  alent from strer
9bf0: 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65  ror() or.** stre
9c00: 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  rror_r()..**.** 
9c10: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
9c20: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
9c30: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
9c40: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9c50: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
9c60: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
9c70: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
9c80: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
9c90: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20  LITE_CANTOPEN). 
9ca0: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
9cb0: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
9cc0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
9cd0: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
9ce0: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
9cf0: 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c  ailed (e.g. "unl
9d00: 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e  ink", "open") an
9d10: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
9d20: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
9d30: 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f  h,.** if any..*/
9d40: 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67  .#define unixLog
9d50: 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20  Error(a,b,c)    
9d60: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9d70: 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45  ine(a,b,c,__LINE
9d80: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75  __).static int u
9d90: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
9da0: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
9db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9dc0: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
9dd0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  rror code */.  c
9de0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
9df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9e00: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
9e10: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
9e20: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
9e30: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
9e40: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
9e50: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
9e60: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
9e70: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e90: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
9ea0: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
9eb0: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
9ec0: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20    char *zErr;   
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f    /* Message fro
9ef0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20  m strerror() or 
9f00: 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20  equivalent */.  
9f10: 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72  int iErrno = err
9f20: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
9f30: 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c  /* Saved syscall
9f40: 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f   error number */
9f50: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
9f60: 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61  s not a threadsa
9f70: 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45  fe build (SQLITE
9f80: 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c  _THREADSAFE==0),
9f90: 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74   then use.  ** t
9fa0: 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75  he strerror() fu
9fb0: 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  nction to obtain
9fc0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
9fd0: 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ble error messag
9fe0: 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e  e.  ** equivalen
9ff0: 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65  t to errno. Othe
a000: 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72  rwise, use strer
a010: 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23  ror_r()..  */ .#
a020: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
a030: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
a040: 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29  HAVE_STRERROR_R)
a050: 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d  .  char aErr[80]
a060: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c  ;.  memset(aErr,
a070: 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29   0, sizeof(aErr)
a080: 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72  );.  zErr = aErr
a090: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52  ;..  /* If STRER
a0a0: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65  ROR_R_CHAR_P (se
a0b0: 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63  t by autoconf sc
a0c0: 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f  ripts) or __USE_
a0d0: 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a  GNU is defined,.
a0e0: 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
a0f0: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
a100: 69 64 65 73 20 74 68 65 20 47 4e 55 20 76 65 72  ides the GNU ver
a110: 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72  sion of strerror
a120: 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72  _r() that.  ** r
a130: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
a140: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
a150: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f  taining the erro
a160: 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20  r message. That 
a170: 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61  pointer .  ** ma
a180: 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b  y point to aErr[
a190: 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69  ], or it may poi
a1a0: 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69  nt to some stati
a1b0: 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68  c storage somewh
a1c0: 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ere. .  ** Other
a1d0: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  wise, assume tha
a1e0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
a1f0: 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20  vides the POSIX 
a200: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
a210: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77   strerror_r(), w
a220: 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74  hich always writ
a230: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
a240: 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e  age into aErr[].
a250: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
a260: 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74  e code incorrect
a270: 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ly assumes that 
a280: 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20  it is the POSIX 
a290: 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a  version that is.
a2a0: 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20    ** available, 
a2b0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
a2c0: 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20  e will often be 
a2d0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
a2e0: 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65   Not a.  ** huge
a2f0: 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72   problem. Incorr
a300: 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67  ectly concluding
a310: 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65   that the GNU ve
a320: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
a330: 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c  le .  ** could l
a340: 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c  ead to a segfaul
a350: 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23  t though..  */.#
a360: 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52  if defined(STRER
a370: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c  ROR_R_CHAR_P) ||
a380: 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47   defined(__USE_G
a390: 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20  NU).  zErr = .# 
a3a0: 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72  endif.  strerror
a3b0: 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c  _r(iErrno, aErr,
a3c0: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29   sizeof(aErr)-1)
a3d0: 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  ;..#elif SQLITE_
a3e0: 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20  THREADSAFE.  /* 
a3f0: 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64  This is a thread
a400: 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20  safe build, but 
a410: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20  strerror_r() is 
a420: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a  not available. *
a430: 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23  /.  zErr = "";.#
a440: 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68  else.  /* Non-th
a450: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
a460: 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20  use strerror(). 
a470: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65  */.  zErr = stre
a480: 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65  rror(iErrno);.#e
a490: 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74  ndif..  if( zPat
a4a0: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
a4b0: 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ";.  sqlite3_log
a4c0: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
a4d0: 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28  "os_unix.c:%d: (
a4e0: 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22  %d) %s(%s) - %s"
a4f0: 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69  ,.      iLine, i
a500: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
a510: 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a  ath, zErr.  );..
a520: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
a530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
a540: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
a550: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  or..**.** We ass
a560: 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29  ume that close()
a570: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77   almost always w
a580: 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69  orks, since it i
a590: 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76  s only in a.** v
a5a0: 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61  ery sick applica
a5b0: 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72  tion or on a ver
a5c0: 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20  y sick platform 
a5d0: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61  that it might fa
a5e0: 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  il..** If it doe
a5f0: 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c  s fail, simply l
a600: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
a610: 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20  criptor, but do 
a620: 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  log the.** error
a630: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
a640: 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  t it is not safe
a650: 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28   to retry close(
a660: 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69  ) after EINTR si
a670: 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nce the.** file 
a680: 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74  descriptor might
a690: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
a6a0: 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f  en reused by ano
a6b0: 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20  ther thread..** 
a6c0: 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e  So we don't even
a6d0: 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20   try to recover 
a6e0: 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20  from an EINTR.  
a6f0: 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72  Just log the err
a700: 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f  or.** and move o
a710: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
a720: 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75  d robust_close(u
a730: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
a740: 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e  int h, int linen
a750: 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73  o){.  if( osClos
a760: 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  e(h) ){.    unix
a770: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53  LogErrorAtLine(S
a780: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
a790: 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20  E, "close",.    
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65     pFile ? pFile
a7c0: 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e  ->zPath : 0, lin
a7d0: 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eno);.  }.}../*.
a7e0: 2a 2a 20 53 65 74 20 74 68 65 20 70 46 69 6c 65  ** Set the pFile
a7f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f  ->lastErrno.  Do
a800: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
a810: 75 74 69 6e 65 20 61 73 20 74 68 61 74 20 70 72  utine as that pr
a820: 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76  ovides.** a conv
a830: 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
a840: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
a850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a860: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
a870: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
a880: 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70   int error){.  p
a890: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
a8a0: 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  = error;.}../*.*
a8b0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  * Close all file
a8c0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63   descriptors acc
a8d0: 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75  umuated in the u
a8e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55  nixInodeInfo->pU
a8f0: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a  nused list..*/ .
a900: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
a910: 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78  ePendingFds(unix
a920: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
a930: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
a940: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
a950: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
a960: 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78  sedFd *p;.  Unix
a970: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
a980: 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d  .  for(p=pInode-
a990: 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70  >pUnused; p; p=p
a9a0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
a9b0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
a9c0: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
a9d0: 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49  ile, p->fd, __LI
a9e0: 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74  NE__);.    sqlit
a9f0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
aa00: 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a 20 20 7d  nUnusedFd--;.  }
aa10: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
aa20: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
aa30: 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49   Release a unixI
aa40: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
aa50: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
aa60: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 49  located by findI
aa70: 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a  nodeInfo()..**.*
aa80: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
aa90: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
aaa0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
aab0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
aac0: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
aad0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
aae0: 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
aaf0: 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64  void releaseInod
ab00: 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a  eInfo(unixFile *
ab10: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
ab20: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
ab30: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
ab40: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
ab50: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
ab60: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64  if( ALWAYS(pInod
ab70: 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  e) ){.    pInode
ab80: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
ab90: 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  ( pInode->nRef==
aba0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
abb0: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  t( pInode->pShmN
abc0: 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ode==0 );.      
abd0: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
abe0: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
abf0: 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20  ( pInode->pPrev 
ac00: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
ac10: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  t( pInode->pPrev
ac20: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20  ->pNext==pInode 
ac30: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
ac40: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  e->pPrev->pNext 
ac50: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
ac60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ac70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e        assert( in
ac80: 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20  odeList==pInode 
ac90: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65  );.        inode
aca0: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  List = pInode->p
acb0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
acc0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
acd0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
ace0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
acf0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
ad00: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
ad10: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
ad20: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e  pPrev = pInode->
ad30: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
ad40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ad50: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d  e(pInode);.    }
ad60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
ad70: 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c 20 6e  nodeList!=0 || n
ad80: 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b 0a 7d  UnusedFd==0 );.}
ad90: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
ada0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
adb0: 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78   locate the unix
adc0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
add0: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
ade0: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
adf0: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
ae00: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
ae10: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
ae20: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69   return value mi
ae30: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
ae40: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
ae50: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
ae60: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
ae70: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
ae80: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
ae90: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
aea0: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
aeb0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
aec0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
aed0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
aee0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
aef0: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f  atic int findIno
af00: 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69  deInfo(.  unixFi
af10: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
af20: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
af30: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
af40: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
af50: 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e   key */.  unixIn
af60: 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64  odeInfo **ppInod
af70: 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  e        /* Retu
af80: 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  rn the unixInode
af90: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65  Info object here
afa0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
afd0: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
afe0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
b010: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
b020: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
b030: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
b040: 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c  ileId;      /* L
b050: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
b060: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
b070: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
b080: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
b090: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
b0a0: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
b0b0: 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  n */.  unixInode
b0c0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30  Info *pInode = 0
b0d0: 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  ;     /* Candida
b0e0: 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  te unixInodeInfo
b0f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73   object */..  as
b100: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
b110: 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47  eld() );..  /* G
b120: 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66  et low-level inf
b130: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
b140: 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20  he file that we 
b150: 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a  can used to.  **
b160: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
b170: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69   name for the fi
b180: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20  le..  */.  fd = 
b190: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d  pFile->h;.  rc =
b1a0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
b1b0: 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63  atbuf);.  if( rc
b1c0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65  !=0 ){.    store
b1d0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
b1e0: 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66   errno);.#if def
b1f0: 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29 20  ined(EOVERFLOW) 
b200: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
b210: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20  E_DISABLE_LFS). 
b220: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61     if( pFile->la
b230: 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c  stErrno==EOVERFL
b240: 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  OW ) return SQLI
b250: 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66  TE_NOLFS;.#endif
b260: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b270: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23  TE_IOERR;.  }..#
b280: 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
b290: 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20    /* On OS X on 
b2a0: 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  an msdos filesys
b2b0: 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e  tem, the inode n
b2c0: 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65  umber is reporte
b2d0: 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74  d.  ** incorrect
b2e0: 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65  ly for zero-size
b2f0: 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63   files.  See tic
b300: 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77  ket #3260.  To w
b310: 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20  ork.  ** around 
b320: 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65  this problem (we
b330: 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62   consider it a b
b340: 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20  ug in OS X, not 
b350: 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20  SQLite).  ** we 
b360: 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20  always increase 
b370: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f  the file size to
b380: 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20   1 by writing a 
b390: 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a  single byte.  **
b3a0: 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73   prior to access
b3b0: 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  ing the inode nu
b3c0: 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62  mber.  The one b
b3d0: 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20  yte written is. 
b3e0: 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27   ** an ASCII 'S'
b3f0: 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68   character which
b400: 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f   also happens to
b410: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79   be the first by
b420: 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68  te.  ** in the h
b430: 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53  eader of every S
b440: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
b450: 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66   In this way, if
b460: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61   there.  ** is a
b470: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
b480: 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65  such that anothe
b490: 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72  r thread has alr
b4a0: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20  eady populated. 
b4b0: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61   ** the first pa
b4c0: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
b4d0: 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73  se, no damage is
b4e0: 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   done..  */.  if
b4f0: 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  ( statbuf.st_siz
b500: 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  e==0 && (pFile->
b510: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
b520: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
b530: 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b  S)!=0 ){.    do{
b540: 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
b550: 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c  , "S", 1); }whil
b560: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
b570: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69  ==EINTR );.    i
b580: 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  f( rc!=1 ){.    
b590: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
b5a0: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
b5b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b5c0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
b5d0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
b5e0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
b5f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
b600: 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
b610: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
b620: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rno);.      retu
b630: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
b640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
b650: 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  f..  memset(&fil
b660: 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  eId, 0, sizeof(f
b670: 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49  ileId));.  fileI
b680: 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  d.dev = statbuf.
b690: 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56  st_dev;.#if OS_V
b6a0: 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e  XWORKS.  fileId.
b6b0: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
b6c0: 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64  ;.#else.  fileId
b6d0: 2e 69 6e 6f 20 3d 20 28 75 36 34 29 73 74 61 74  .ino = (u64)stat
b6e0: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
b6f0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 69 6e 6f  if.  assert( ino
b700: 64 65 4c 69 73 74 21 3d 30 20 7c 7c 20 6e 55 6e  deList!=0 || nUn
b710: 75 73 65 64 46 64 3d 3d 30 20 29 3b 0a 20 20 70  usedFd==0 );.  p
b720: 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73  Inode = inodeLis
b730: 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  t;.  while( pIno
b740: 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69  de && memcmp(&fi
b750: 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66  leId, &pInode->f
b760: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
b770: 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49  leId)) ){.    pI
b780: 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
b790: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
b7a0: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
b7b0: 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65   pInode = sqlite
b7c0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
b7d0: 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20  of(*pInode) );. 
b7e0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30     if( pInode==0
b7f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b800: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
b810: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  PT;.    }.    me
b820: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
b830: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
b840: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
b850: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
b860: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
b870: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
b880: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
b890: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
b8a0: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
b8b0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
b8c0: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
b8d0: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
b8e0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
b8f0: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
b900: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
b910: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
b920: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
b930: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
b940: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b950: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
b960: 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69  turn TRUE if pFi
b970: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61  le has been rena
b980: 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20  med or unlinked 
b990: 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72  since it was fir
b9a0: 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74  st opened..*/.st
b9b0: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73  atic int fileHas
b9c0: 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a  Moved(unixFile *
b9d0: 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56  pFile){.#if OS_V
b9e0: 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
b9f0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
ba00: 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d   && pFile->pId!=
ba10: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66  pFile->pInode->f
ba20: 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65  ileId.pId;.#else
ba30: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
ba40: 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  uf;.  return pFi
ba50: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
ba60: 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70  .      (osStat(p
ba70: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
ba80: 66 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  f)!=0 .         
ba90: 7c 7c 20 28 75 36 34 29 62 75 66 2e 73 74 5f 69  || (u64)buf.st_i
baa0: 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  no!=pFile->pInod
bab0: 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a  e->fileId.ino);.
bac0: 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
bad0: 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c   Check a unixFil
bae0: 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61  e that is a data
baf0: 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68  base.  Verify th
bb00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
bb10: 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20  ** (1) There is 
bb20: 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64  exactly one hard
bb30: 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c   link on the fil
bb40: 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c  e.** (2) The fil
bb50: 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f  e is not a symbo
bb60: 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20  lic link.** (3) 
bb70: 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  The file has not
bb80: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
bb90: 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20   unlinked.**.** 
bba0: 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f  Issue sqlite3_lo
bbb0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
bbc0: 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69  ,...) messages i
bbd0: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f  f anything is no
bbe0: 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  t right..*/.stat
bbf0: 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62  ic void verifyDb
bc00: 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
bc10: 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20  File){.  struct 
bc20: 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20  stat buf;.  int 
bc30: 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 73 65 20  rc;..  /* These 
bc40: 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 6f 63  verifications oc
bc50: 63 75 72 73 20 66 6f 72 20 74 68 65 20 6d 61 69  curs for the mai
bc60: 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20  n database only 
bc70: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
bc80: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
bc90: 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 20 72 65  FILE_NOLOCK ) re
bca0: 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d 20 6f 73  turn;..  rc = os
bcb0: 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
bcc0: 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  &buf);.  if( rc!
bcd0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
bce0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
bcf0: 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73  NING, "cannot fs
bd00: 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c  tat db file %s",
bd10: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
bd20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
bd30: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
bd40: 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  nk==0 ){.    sql
bd50: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
bd60: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75  WARNING, "file u
bd70: 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70  nlinked while op
bd80: 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  en: %s", pFile->
bd90: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
bda0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75  rn;.  }.  if( bu
bdb0: 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a  f.st_nlink>1 ){.
bdc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
bdd0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
bde0: 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20  "multiple links 
bdf0: 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46  to file: %s", pF
be00: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
be10: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
be20: 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28  f( fileHasMoved(
be30: 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 73 71  pFile) ){.    sq
be40: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
be50: 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20  _WARNING, "file 
be60: 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f 70  renamed while op
be70: 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  en: %s", pFile->
be80: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
be90: 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn;.  }.}.../*.*
bea0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
beb0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
bec0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
bed0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
bee0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
bef0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
bf00: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
bf10: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
bf20: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
bf30: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
bf40: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
bf50: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
bf60: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
bf70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
bf80: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
bf90: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
bfa0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
bfb0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
bfc0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
bfd0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
bfe0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
bff0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
c000: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
c010: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c020: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
c030: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
c040: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
c050: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
c060: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
c070: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
c080: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
c090: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
c0a0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
c0b0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
c0c0: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
c0d0: 43 4b 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  CK );.  unixEnte
c0e0: 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
c0f0: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
c100: 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
c110: 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a  oss threads */..
c120: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
c130: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
c140: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
c150: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
c160: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
c170: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
c180: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
c190: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
c1a0: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
c1b0: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
c1c0: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
c1d0: 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  it..  */.#ifndef
c1e0: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28   __DJGPP__.  if(
c1f0: 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70   !reserved && !p
c200: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
c210: 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20  rocessLock ){.  
c220: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
c230: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ock;.    lock.l_
c240: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
c250: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
c260: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
c270: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
c280: 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  len = 1;.    loc
c290: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
c2a0: 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63  CK;.    if( osFc
c2b0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
c2c0: 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b  GETLK, &lock) ){
c2d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c2e0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
c2f0: 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20  SERVEDLOCK;.    
c300: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
c310: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
c320: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
c330: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
c340: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
c350: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
c360: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
c370: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
c380: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
c390: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
c3a0: 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d %d (unix)\n", 
c3b0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
c3c0: 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
c3d0: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
c3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c3f0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
c400: 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d  to set a system-
c410: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
c420: 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63   pFile.  The loc
c430: 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62  k is .** describ
c440: 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a  ed by pLock..**.
c450: 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20  ** If the pFile 
c460: 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f  was opened read/
c470: 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d  write from unix-
c480: 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f  excl, then the o
c490: 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72  nly lock.** ever
c4a0: 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20   obtained is an 
c4b0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
c4c0: 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e  and it is obtain
c4d0: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a  ed exactly once.
c4e0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ** the first tim
c4f0: 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74  e any lock is at
c500: 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75  tempted.  All su
c510: 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20  bsequent system 
c520: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  locking.** opera
c530: 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d  tions become no-
c540: 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70  ops.  Locking op
c550: 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68  erations still h
c560: 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  appen internally
c570: 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  ,.** in order to
c580: 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65   coordinate acce
c590: 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72  ss between separ
c5a0: 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ate database con
c5b0: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68  nections.** with
c5c0: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  in this process,
c5d0: 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74   but all of that
c5e0: 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d   is handled in m
c5f0: 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a  emory and the.**
c600: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
c610: 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69  m does not parti
c620: 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cipate..**.** Th
c630: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
c640: 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f   pass-through to
c650: 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20   fcntl(F_SETLK) 
c660: 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e  if pFile is usin
c670: 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68  g.** any VFS oth
c680: 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78  er than "unix-ex
c690: 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20  cl" or if pFile 
c6a0: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e  is opened on "un
c6b0: 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20  ix-excl".** and 
c6c0: 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a  is read-only..**
c6d0: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
c6e0: 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c  rned if the call
c6f0: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
c700: 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69  ssfully, or -1 i
c710: 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66  f a call.** to f
c720: 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e  cntl() fails. In
c730: 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e   this case, errn
c740: 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72  o is set appropr
c750: 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c  iately (by fcntl
c760: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
c770: 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  nt unixFileLock(
c780: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
c790: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
c7a0: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Lock){.  int rc;
c7b0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
c7c0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
c7d0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
c7e0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
c7f0: 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d() );.  assert(
c800: 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20   pInode!=0 );.  
c810: 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  if( (pFile->ctrl
c820: 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46 49 4c  Flags & (UNIXFIL
c830: 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c 45 5f  E_EXCL|UNIXFILE_
c840: 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58 46 49  RDONLY))==UNIXFI
c850: 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20 20 69  LE_EXCL ){.    i
c860: 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
c870: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
c880: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
c890: 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73   lock;.      ass
c8a0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
c8b0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c  ck==0 );.      l
c8c0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
c8d0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
c8e0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
c8f0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
c900: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
c910: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
c920: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c930: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_WRLCK;.      r
c940: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
c950: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
c960: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  lock);.      if(
c970: 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72   rc<0 ) return r
c980: 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  c;.      pInode-
c990: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20  >bProcessLock = 
c9a0: 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  1;.      pInode-
c9b0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65  >nLock++;.    }e
c9c0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
c9d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
c9e0: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
c9f0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
ca00: 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20  ETLK, pLock);.  
ca10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ca20: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
ca30: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
ca40: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
ca50: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
ca60: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
ca70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
ca80: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
ca90: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
caa0: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
cab0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
cac0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
cad0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
cae0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
caf0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
cb00: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
cb10: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
cb20: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
cb30: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
cb40: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
cb50: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
cb60: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
cb70: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
cb80: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
cb90: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
cba0: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
cbb0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
cbc0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
cbd0: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
cbe0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
cbf0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
cc00: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
cc10: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
cc20: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
cc30: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
cc40: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
cc50: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
cc60: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
cc70: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
cc80: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
cc90: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
cca0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
ccb0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
ccc0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
ccd0: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
cce0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
ccf0: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
cd00: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
cd10: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
cd20: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
cd30: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
cd40: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
cd50: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
cd60: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
cd70: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
cd80: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
cd90: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
cda0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
cdb0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
cdc0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
cdd0: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
cde0: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
cdf0: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
ce00: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
ce10: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
ce20: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
ce30: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
ce40: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
ce50: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
ce60: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
ce70: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
ce80: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
ce90: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
cea0: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
ceb0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
cec0: 74 69 62 6c 65 20 77 69 74 68 20 57 69 6e 64 6f  tible with Windo
ced0: 77 73 39 35 20 73 79 73 74 65 6d 73 20 73 69 6d  ws95 systems sim
cee0: 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a  ultaneously.  **
cef0: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
cf00: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
cf10: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20  e, in case that 
cf20: 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64  is ever required
cf30: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62  ..  **.  ** Symb
cf40: 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f  ols defined in o
cf50: 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68  s.h indentify th
cf60: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
cf70: 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76   and the 'reserv
cf80: 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65  ed.  ** byte', e
cf90: 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73  ach single bytes
cfa0: 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f   at well known o
cfb0: 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20  ffsets, and the 
cfc0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
cfd0: 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67  * range', a rang
cfe0: 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61  e of 510 bytes a
cff0: 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f  t a well known o
d000: 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ffset..  **.  **
d010: 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41   To obtain a SHA
d020: 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64  RED lock, a read
d030: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
d040: 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  d on the 'pendin
d050: 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49  g.  ** byte'.  I
d060: 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73  f this is succes
d070: 73 66 75 6c 2c 20 27 73 68 61 72 65 64 20 62 79  sful, 'shared by
d080: 74 65 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  te range' is rea
d090: 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20 61 6e  d-locked.  ** an
d0a0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
d0b0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
d0c0: 20 72 65 6c 65 61 73 65 64 2e 20 20 28 4c 65 67   released.  (Leg
d0d0: 61 63 79 20 6e 6f 74 65 3a 20 20 57 68 65 6e 0a  acy note:  When.
d0e0: 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 61 73 20    ** SQLite was 
d0f0: 66 69 72 73 74 20 64 65 76 65 6c 6f 70 65 64 2c  first developed,
d100: 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65   Windows95 syste
d110: 6d 73 20 77 65 72 65 20 73 74 69 6c 6c 20 76 65  ms were still ve
d120: 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a 2a 20  ry common,.  ** 
d130: 61 6e 64 20 57 69 64 6e 6f 77 73 39 35 20 6c 61  and Widnows95 la
d140: 63 6b 73 20 61 20 73 68 61 72 65 64 2d 6c 6f 63  cks a shared-loc
d150: 6b 20 63 61 70 61 62 69 6c 69 74 79 2e 20 20 53  k capability.  S
d160: 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 2c 20  o on Windows95, 
d170: 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 72 61  a.  ** single ra
d180: 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 20  ndomly selected 
d190: 62 79 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  by from the 'sha
d1a0: 72 65 64 20 62 79 74 65 20 72 61 6e 67 65 27 20  red byte range' 
d1b0: 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2a 20  is locked..  ** 
d1c0: 57 69 6e 64 6f 77 73 39 35 20 69 73 20 6e 6f 77  Windows95 is now
d1d0: 20 70 72 65 74 74 79 20 6d 75 63 68 20 65 78 74   pretty much ext
d1e0: 69 6e 63 74 2c 20 62 75 74 20 74 68 69 73 20 77  inct, but this w
d1f0: 6f 72 6b 2d 61 72 6f 75 6e 64 20 66 6f 72 20 74  ork-around for t
d200: 68 65 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f 66 20  he.  ** lack of 
d210: 73 68 61 72 65 64 2d 6c 6f 63 6b 73 20 6f 6e 20  shared-locks on 
d220: 57 69 6e 64 6f 77 73 39 35 20 6c 69 76 65 73 20  Windows95 lives 
d230: 6f 6e 2c 20 66 6f 72 20 62 61 63 6b 77 61 72 64  on, for backward
d240: 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 69  s.  ** compatibi
d250: 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  lity.).  **.  **
d260: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
d270: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
d280: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
d290: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
d2a0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
d2b0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
d2c0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
d2d0: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
d2e0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
d2f0: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
d300: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
d310: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
d320: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
d330: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
d340: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
d350: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
d360: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
d370: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
d380: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
d390: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
d3a0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
d3b0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
d3c0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
d3d0: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
d3e0: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
d3f0: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
d400: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
d410: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
d420: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
d430: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
d440: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
d450: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
d460: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
d470: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
d480: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
d490: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
d4a0: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
d4b0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
d4c0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
d4d0: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
d4e0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
d4f0: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
d500: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
d510: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
d520: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
d530: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
d540: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
d550: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
d560: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
d570: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
d580: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
d590: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
d5a0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
d5b0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
d5c0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
d5d0: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
d5e0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
d5f0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
d600: 62 61 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 6e  base. .  */.  in
d610: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d620: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
d630: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d640: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
d650: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
d660: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
d670: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
d680: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
d690: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
d6a0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
d6b0: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
d6c0: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
d6d0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
d6e0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
d6f0: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
d700: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
d710: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
d720: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
d730: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d740: 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  k), pFile->pInod
d750: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
d760: 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
d770: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d780: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
d790: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
d7a0: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
d7b0: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
d7c0: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
d7d0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
d7e0: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
d7f0: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
d800: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
d810: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
d820: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
d830: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d840: 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
d850: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
d860: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
d870: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
d880: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
d890: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
d8a0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
d8b0: 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
d8c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d8d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d8e0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
d8f0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
d900: 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20  rect..  **  (1) 
d910: 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
d920: 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
d930: 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
d940: 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
d950: 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
d960: 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
d970: 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
d980: 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
d990: 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
d9a0: 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
d9b0: 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
d9c0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
d9d0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
d9e0: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
d9f0: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
da00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
da10: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
da20: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
da30: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
da40: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
da50: 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
da60: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
da70: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
da80: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
da90: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
daa0: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
dab0: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
dac0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
dad0: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
dae0: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
daf0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
db00: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
db10: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
db20: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
db30: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
db40: 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
db50: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
db60: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
db70: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
db80: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
db90: 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
dba0: 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
dbb0: 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
dbc0: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
dbd0: 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
dbe0: 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
dbf0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
dc00: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
dc10: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
dc20: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
dc30: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
dc40: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
dc50: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
dc60: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
dc70: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
dc80: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
dc90: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
dca0: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
dcb0: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
dcc0: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
dcd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
dce0: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
dcf0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
dd00: 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f   && .      (pIno
dd10: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
dd20: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
dd30: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
dd40: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
dd50: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
dd60: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
dd70: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
dd80: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
dd90: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
dda0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
ddb0: 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
ddc0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ddd0: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
dde0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
ddf0: 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
de00: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
de10: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
de20: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e    }...  /* A PEN
de30: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
de40: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
de50: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
de60: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
de70: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
de80: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
de90: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
dea0: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
deb0: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
dec0: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
ded0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
dee0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
def0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69   = SEEK_SET;.  i
df00: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
df10: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
df20: 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
df30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
df40: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
df50: 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
df60: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
df70: 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f  _type = (eFileLo
df80: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  ck==SHARED_LOCK?
df90: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
dfa0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
dfb0: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
dfc0: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
dfd0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
dfe0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
dff0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e000: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e010: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
e020: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
e030: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
e040: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e050: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
e060: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
e070: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
e080: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
e090: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
e0a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
e0b0: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
e0c0: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
e0d0: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
e0e0: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
e0f0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
e100: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
e110: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
e120: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
e130: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
e140: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
e150: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
e160: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
e170: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
e180: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
e190: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
e1a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
e1b0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
e1c0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
e1d0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e1e0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
e1f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e200: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
e210: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
e220: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
e230: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
e240: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
e250: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
e260: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
e270: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
e280: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
e290: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
e2a0: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
e2b0: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
e2c0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
e2d0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
e2e0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
e2f0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
e300: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
e310: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e320: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
e330: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
e340: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e350: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
e360: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
e370: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
e380: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e390: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e3a0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
e3b0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
e3c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
e3d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
e3e0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
e3f0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
e400: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
e410: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
e420: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
e430: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e440: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
e450: 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
e460: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
e470: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
e480: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
e490: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
e4a0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e4b0: 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
e4c0: 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
e4d0: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
e4e0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
e4f0: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
e500: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
e510: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
e520: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
e530: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
e540: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
e550: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
e560: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
e570: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
e580: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
e590: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
e5a0: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
e5b0: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
e5c0: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
e5d0: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
e5e0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
e5f0: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
e600: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
e610: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
e620: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
e630: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20  e = F_WRLCK;..  
e640: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
e650: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
e660: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
e670: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
e680: 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  );.    if( eFile
e690: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
e6a0: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
e6b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
e6c0: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
e6d0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
e6e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e6f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e700: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
e710: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e720: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
e730: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
e740: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e750: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
e760: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
e770: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
e780: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
e790: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
e7a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
e7b0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
e7c0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
e7d0: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
e7e0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e7f0: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
e800: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69      }.  }.  ..#i
e810: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
e820: 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  G.  /* Set up th
e830: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f  e transaction-co
e840: 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65  unter change che
e850: 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e  cking flags when
e860: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  .  ** transition
e870: 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45  ing from a SHARE
e880: 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20  D to a RESERVED 
e890: 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67  lock.  The chang
e8a0: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52  e.  ** from SHAR
e8b0: 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d  ED to RESERVED m
e8c0: 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69  arks the beginni
e8d0: 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20  ng of a normal. 
e8e0: 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74   ** write operat
e8f0: 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a  ion (not a hot j
e900: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
e910: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
e920: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
e930: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e940: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20  k<=SHARED_LOCK. 
e950: 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d    && eFileLock==
e960: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20  RESERVED_LOCK.  
e970: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  ){.    pFile->tr
e980: 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b  ansCntrChng = 0;
e990: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
e9a0: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  date = 0;.    pF
e9b0: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
e9c0: 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  te = 1;.  }.#end
e9d0: 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  if...  if( rc==S
e9e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e9f0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ea00: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
ea10: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
ea20: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
ea30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
ea40: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
ea50: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
ea60: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
ea70: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
ea80: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
ea90: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
eaa0: 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f  OCK;.  }..end_lo
eab0: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
eac0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
ead0: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
eae0: 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20  s %s (unix)\n", 
eaf0: 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
eb00: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
eb10: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
eb20: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
eb30: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
eb40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
eb50: 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65   Add the file de
eb60: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79  scriptor used by
eb70: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69   file handle pFi
eb80: 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73  le to the corres
eb90: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73  ponding.** pUnus
eba0: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ed list..*/.stat
ebb0: 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69  ic void setPendi
ebc0: 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  ngFd(unixFile *p
ebd0: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
ebe0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
ebf0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
ec00: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
ec10: 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50 72 65 61  p = pFile->pPrea
ec20: 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 3b 0a  llocatedUnused;.
ec30: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
ec40: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ode->pUnused;.  
ec50: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
ec60: 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  = p;.  pFile->h 
ec70: 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  = -1;.  pFile->p
ec80: 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
ec90: 65 64 20 3d 20 30 3b 0a 20 20 6e 55 6e 75 73 65  ed = 0;.  nUnuse
eca0: 64 46 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dFd++;.}../*.** 
ecb0: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
ecc0: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
ecd0: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
ece0: 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
ecf0: 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
ed00: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
ed10: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
ed20: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
ed30: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
ed40: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
ed50: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
ed60: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
ed70: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
ed80: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
ed90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
eda0: 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  o-op..** .** If 
edb0: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
edc0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
edd0: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20   downgrading an 
ede0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74  EXCLUSIVE_LOCK t
edf0: 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20  o SHARED.** the 
ee00: 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69  byte range is di
ee10: 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72  vided into 2 par
ee20: 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ts and the first
ee30: 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65   part is unlocke
ee40: 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f  d then.** set to
ee50: 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68   a read lock, th
ee60: 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72  en the other par
ee70: 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f  t is simply unlo
ee80: 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b  cked.  This work
ee90: 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62  s .** around a b
eea0: 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f  ug in BSD NFS lo
eeb0: 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f  ckd (also seen o
eec0: 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20  n MacOSX 10.3+) 
eed0: 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a  that fails to .*
eee0: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69  * remove the wri
eef0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67  te lock on a reg
ef00: 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20  ion when a read 
ef10: 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  lock is set..*/.
ef20: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
ef30: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
ef40: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
ef50: 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64  leLock, int hand
ef60: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20  leNFSUnlock){.  
ef70: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
ef80: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
ef90: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
efa0: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
efb0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
efc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
efd0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
efe0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
eff0: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
f000: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
f010: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
f020: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
f030: 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46  leLock,.      pF
f040: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
f050: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
f060: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
f070: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
f080: 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64  ,.      osGetpid
f090: 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  (0)));..  assert
f0a0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
f0b0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
f0c0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
f0d0: 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
f0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f0f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
f100: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
f110: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
f120: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
f130: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
f140: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
f150: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
f160: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
f170: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
f180: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
f190: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
f1a0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f1b0: 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  _DEBUG.    /* Wh
f1c0: 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
f1d0: 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
f1e0: 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
f1f0: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
f200: 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
f210: 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
f220: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
f230: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
f240: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
f250: 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
f260: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
f270: 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
f280: 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
f290: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
f2a0: 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
f2b0: 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
f2c0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
f2d0: 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
f2e0: 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
f2f0: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
f300: 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
f310: 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
f320: 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
f330: 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
f340: 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
f350: 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
f360: 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
f370: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
f380: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
f390: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
f3a0: 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
f3b0: 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64  .    /* downgrad
f3c0: 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20  ing to a shared 
f3d0: 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f  lock on NFS invo
f3e0: 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68  lves clearing th
f3f0: 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20  e write lock.   
f400: 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62   ** before estab
f410: 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64  lishing the read
f420: 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20  lock - to avoid 
f430: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
f440: 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20   we downgrade.  
f450: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e    ** the lock in
f460: 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68   2 blocks, so th
f470: 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  at part of the r
f480: 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76  ange will be cov
f490: 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a  ered by a .    *
f4a0: 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74  * write lock unt
f4b0: 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63  il the rest is c
f4c0: 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64  overed by a read
f4d0: 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31   lock:.    **  1
f4e0: 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20  :   [WWWWW].    
f4f0: 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d  **  2:   [....W]
f500: 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52  .    **  3:   [R
f510: 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a  RRRW].    **  4:
f520: 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a     [RRRR.].    *
f530: 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  /.    if( eFileL
f540: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
f550: 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   ){.#if !defined
f560: 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21  (__APPLE__) || !
f570: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
f580: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
f590: 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46    (void)handleNF
f5a0: 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  SUnlock;.      a
f5b0: 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53  ssert( handleNFS
f5c0: 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e  Unlock==0 );.#en
f5d0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
f5e0: 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
f5f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
f600: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
f610: 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
f620: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ock ){.        i
f630: 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  nt tErrno;      
f640: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
f650: 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
f660: 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
f670: 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
f680: 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
f690: 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
f6a0: 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
f6b0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f6c0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f6d0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f6e0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f6f0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f700: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f710: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
f720: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f730: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f740: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f750: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
f760: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f770: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
f780: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f790: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
f7a0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
f7b0: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
f7c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
f7d0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
f7e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
f7f0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
f800: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f810: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f820: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f830: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f840: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f850: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
f860: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f870: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f880: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f890: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
f8a0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f8b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
f8c0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
f8d0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
f8e0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
f8f0: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
f900: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f910: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
f920: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
f930: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
f940: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
f950: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
f960: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
f970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f980: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f990: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
f9a0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f9b0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
f9c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f9d0: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76  SHARED_FIRST+div
f9e0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f  Size;.        lo
f9f0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
fa00: 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a  D_SIZE-divSize;.
fa10: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
fa20: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
fa30: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
fa40: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
fa50: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
fa60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
fa70: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
fa80: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
fa90: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
faa0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
fab0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
fac0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fad0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
fae0: 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
faf0: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
fb00: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
fb10: 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  YLE */.      {. 
fb20: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
fb30: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
fb40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
fb50: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
fb60: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
fb70: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
fb80: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
fb90: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
fba0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
fbb0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
fbc0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
fbd0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
fbe0: 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
fbf0: 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
fc00: 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
fc10: 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
fc20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
fc30: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
fc40: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
fc50: 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
fc60: 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
fc70: 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
fc80: 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
fc90: 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
fca0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
fcb0: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
fcc0: 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
fcd0: 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
fce0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
fcf0: 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
fd00: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
fd10: 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
fd20: 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
fd30: 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
fd40: 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
fd50: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
fd60: 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
fd70: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
fd80: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
fd90: 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
fda0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
fdb0: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
fdc0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
fdd0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
fde0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
fdf0: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
fe00: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
fe10: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
fe20: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
fe30: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
fe40: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
fe50: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
fe60: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
fe70: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
fe80: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
fe90: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
fea0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
feb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  =0 ){.      pIno
fec0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
fed0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
fee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
fef0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
ff00: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  UNLOCK;.      st
ff10: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
ff20: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
ff30: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
ff40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
ff50: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
ff60: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
ff70: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
ff80: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
ff90: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
ffa0: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
ffb0: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
ffc0: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
ffd0: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
ffe0: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
fff0: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
10000 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
10010 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
10020 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
10030 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
10040 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
10050 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
10060 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10070 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10080 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10090 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
100a0 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20  = 0L;.      if( 
100b0 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
100c0 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
100d0 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
100e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
100f0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
10100 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
10110 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10120 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  OCK;.        sto
10130 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
10140 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
10150 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
10160 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
10170 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
10180 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
10190 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
101a0 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
101b0 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
101c0 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
101d0 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
101e0 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
101f0 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
10200 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
10210 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
10220 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
10230 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
10240 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
10250 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
10260 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
10270 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
10280 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
10290 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
102a0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
102b0 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
102c0 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
102d0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
102e0 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a   }..end_unlock:.
102f0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
10300 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
10310 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
10320 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
10330 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
10340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
10350 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
10360 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
10370 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
10380 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
10390 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
103a0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
103b0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
103c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
103d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
103e0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
103f0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
10400 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
10410 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
10420 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
10430 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10440 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10450 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
10460 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10470 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23  nt eFileLock){.#
10480 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
10490 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65  AP_SIZE>0.  asse
104a0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
104b0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28  HARED_LOCK || ((
104c0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e  unixFile *)id)->
104d0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
104e0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
104f0 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
10500 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d  eFileLock, 0);.}
10510 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
10520 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
10530 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66  tic int unixMapf
10540 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
10550 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73  d, i64 nByte);.s
10560 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
10570 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
10580 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a  e *pFd);.#endif.
10590 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
105a0 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
105b0 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
105c0 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
105d0 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
105e0 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
105f0 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
10600 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
10610 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
10620 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
10630 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
10640 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
10650 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
10660 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
10670 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
10680 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
10690 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
106a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
106b0 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
106c0 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
106d0 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
106e0 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
106f0 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
10700 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
10710 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
10720 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
10730 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
10740 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
10750 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10760 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
10770 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
10780 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69  MAP_SIZE>0.  uni
10790 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
107a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
107b0 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
107c0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
107d0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
107e0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
107f0 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
10800 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
10810 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  S.  if( pFile->p
10820 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  Id ){.    if( pF
10830 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
10840 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
10850 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
10860 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a  nk(pFile->pId->z
10870 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
10880 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b      }.    vxwork
10890 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
108a0 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
108b0 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a  pFile->pId = 0;.
108c0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
108d0 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f  f SQLITE_UNLINK_
108e0 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66  AFTER_CLOSE.  if
108f0 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
10900 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
10910 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e  LETE ){.    osUn
10920 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74  link(pFile->zPat
10930 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
10940 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70  free(*(char**)&p
10950 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
10960 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
10970 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
10980 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
10990 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
109a0 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  e->h));.  OpenCo
109b0 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
109c0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
109d0 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
109e0 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28  used);.  memset(
109f0 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
10a00 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72  (unixFile));.  r
10a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10a30 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
10a40 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
10a50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10a60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10a70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
10a80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10a90 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76  ixFile *)id;.  v
10aa0 65 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c  erifyDbFile(pFil
10ab0 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  e);.  unixUnlock
10ac0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
10ad0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
10ae0 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c  );..  /* unixFil
10af0 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61  e.pInode is alwa
10b00 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f  ys valid here. O
10b10 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66  therwise, a diff
10b20 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a  erent close.  **
10b30 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e   routine (e.g. n
10b40 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f  olockClose()) wo
10b50 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  uld be called in
10b60 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  stead..  */.  as
10b70 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e  sert( pFile->pIn
10b80 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20  ode->nLock>0 || 
10b90 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
10ba0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
10bb0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
10bc0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26  File->pInode) &&
10bd0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
10be0 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20  nLock ){.    /* 
10bf0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
10c00 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
10c10 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
10c20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
10c30 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62  ust.    ** yet b
10c40 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
10c50 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
10c60 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
10c70 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
10c80 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
10c90 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
10ca0 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
10cb0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
10cc0 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20   closed .    ** 
10cd0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
10ce0 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
10cf0 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e     */.    setPen
10d00 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
10d10 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64   }.  releaseInod
10d20 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
10d30 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
10d40 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65  le(id);.  unixLe
10d50 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
10d60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10d80 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
10d90 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
10da0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
10e80 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
10e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10eb0 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
10ec0 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
10ed0 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
10ee0 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
10ef0 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
10f00 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
10f10 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
10f20 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
10f30 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
10f40 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
10f50 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
10f60 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
10f70 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
10f80 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
10f90 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
10fa0 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
10fb0 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
10fc0 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
10fd0 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
10fe0 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
10ff0 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
11000 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
11010 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
11020 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
11030 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
11040 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
11050 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
11060 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
11070 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
11080 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
11090 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
110a0 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
110b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
110c0 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
110d0 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
110e0 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
110f0 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
11100 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
11110 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
11120 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
11130 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
11140 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
11150 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
11160 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
11170 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
11180 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
11190 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
111a0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
111b0 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
111c0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
111d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
111e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
111f0 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
11200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11210 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
11220 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
11230 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
11240 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
11250 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11260 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
11270 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
11280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
11290 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
112a0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
112b0 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
112c0 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
112d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
112e0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
112f0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
11300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11310 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
11320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
11330 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
11340 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
11350 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
11360 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
11370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11380 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
11390 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
113a0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
113b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
113c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
11410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11470 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
11480 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
11490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
114b0 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
114c0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
114d0 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
114e0 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65   existence of se
114f0 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
11500 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64  iles (really a d
11510 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e  irectory) to con
11520 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
11530 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
11540 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a  is works.** on j
11550 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20  ust about every 
11560 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
11570 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
11580 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
11590 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
115a0 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
115b0 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
115c0 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
115d0 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
115e0 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
115f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
11600 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
11610 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
11620 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
11630 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
11640 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
11650 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
11660 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
11670 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
11680 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
11690 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
116a0 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
116b0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
116c0 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
116d0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
116e0 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
116f0 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
11700 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
11710 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
11720 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
11730 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
11740 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f  ing a subdirecto
11750 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ry in the same d
11760 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74  irectory as.** t
11770 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
11780 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
11790 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
117a0 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
117b0 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
117c0 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istence of a loc
117d0 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c  k directory impl
117e0 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
117f0 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
11800 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20  r.** lock types 
11810 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
11820 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
11830 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
11840 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
11850 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
11860 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
11870 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
11880 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
11890 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
118a0 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64  directory..*/.#d
118b0 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
118c0 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
118d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
118e0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
118f0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
11900 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
11910 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11920 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11930 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11940 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11950 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11960 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11970 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11980 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11990 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
119a0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
119b0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
119c0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
119d0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
119e0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
119f0 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
11a00 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
11a10 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
11a20 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
11a30 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
11a40 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
11a50 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
11a60 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
11a70 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
11a80 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
11a90 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
11aa0 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
11ab0 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
11ac0 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
11ad0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
11ae0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
11af0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11b00 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
11b10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11b20 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
11b30 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
11b40 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11b50 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
11b60 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
11b70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11b80 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
11b90 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
11ba0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11bb0 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73  .  reserved = os
11bc0 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20 63 68  Access((const ch
11bd0 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
11be0 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30  ngContext, 0)==0
11bf0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
11c00 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
11c10 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22   %d (dotlock)\n"
11c20 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
11c30 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70  reserved));.  *p
11c40 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
11c50 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
11c60 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
11c70 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
11c80 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
11c90 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
11ca0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
11cb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
11cc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
11cd0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
11ce0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
11cf0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
11d00 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
11d10 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
11d20 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
11d30 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
11d40 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
11d50 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
11d60 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
11d70 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
11d80 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
11d90 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
11da0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
11db0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
11dc0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
11dd0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
11de0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
11df0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
11e00 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
11e10 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
11e20 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
11e30 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
11e40 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11e50 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
11e60 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
11e70 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
11e80 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
11e90 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
11ea0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
11eb0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
11ec0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11ed0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
11ee0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
11ef0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
11f00 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
11f10 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
11f20 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
11f30 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
11f40 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
11f50 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
11f60 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
11f70 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
11f80 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64  el..**.** With d
11f90 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
11fa0 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73  we really only s
11fb0 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29  upport state (4)
11fc0 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20  : EXCLUSIVE..** 
11fd0 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65  But we track the
11fe0 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c   other locking l
11ff0 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79  evels internally
12000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12010 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  dotlockLock(sqli
12020 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12030 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
12040 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12050 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12060 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
12070 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
12080 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
12090 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ext;.  int rc = 
120a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
120b0 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79  * If we have any
120c0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
120d0 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
120e0 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77  y exists.  All w
120f0 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
12100 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20  o is adjust our 
12110 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
12120 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65  of the lock leve
12130 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  l..  */.  if( pF
12140 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
12150 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20   NO_LOCK ){.    
12160 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12170 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12180 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61    /* Always upda
12190 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  te the timestamp
121a0 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65   on the old file
121b0 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f   */.#ifdef HAVE_
121c0 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28  UTIME.    utime(
121d0 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
121e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d  ;.#else.    utim
121f0 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  es(zLockFile, NU
12200 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
12210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12220 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
12230 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
12240 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f  lock */.  rc = o
12250 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sMkdir(zLockFile
12260 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72  , 0777);.  if( r
12270 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  c<0 ){.    /* fa
12280 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
12290 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72  ate the lock dir
122a0 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e  ectory */.    in
122b0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
122c0 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
122d0 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
122e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
122f0 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
12300 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
12310 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12320 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12330 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
12340 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
12350 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
12360 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
12370 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12380 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
12390 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
123a0 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f   rc;.  } .  .  /
123b0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
123c0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
123d0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
123e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
123f0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
12400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12410 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
12420 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
12430 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
12440 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
12450 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
12460 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
12470 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
12480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
12490 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
124a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
124b0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
124c0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
124d0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
124e0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
124f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12500 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
12510 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12520 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
12530 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
12540 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
12550 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
12560 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12570 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
12580 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
12590 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
125a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
125b0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
125c0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
125d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
125e0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
125f0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
12600 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
12610 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
12620 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
12630 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
12640 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
12650 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12660 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
12670 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
12680 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
12690 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
126a0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
126b0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
126c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
126d0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
126e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
126f0 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67  }..  /* To downg
12700 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20  rade to shared, 
12710 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75  simply update ou
12720 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f  r internal notio
12730 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
12740 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65  ck state.  No ne
12750 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20  ed to mess with 
12760 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
12770 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
12780 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
12790 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
127a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
127b0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  ARED_LOCK;.    r
127c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
127d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20  .  }.  .  /* To 
127e0 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65  fully unlock the
127f0 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74   database, delet
12800 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  e the lock file 
12810 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  */.  assert( eFi
12820 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
12830 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69  );.  rc = osRmdi
12840 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  r(zLockFile);.  
12850 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
12860 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12870 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45 72 72  no;.    if( tErr
12880 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no==ENOENT ){.  
12890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
128a0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
128b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
128c0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
128d0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
128e0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
128f0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  o);.    }.    re
12900 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
12910 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12920 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
12930 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12940 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
12950 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
12960 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
12970 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
12980 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
12990 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
129a0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
129b0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e  file *id) {.  un
129c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
129d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
129e0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
129f0 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  ;.  dotlockUnloc
12a00 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
12a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12a20 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
12a30 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  text);.  return 
12a40 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
12a50 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}./**********
12a60 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
12a70 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  the dot-file loc
12a80 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
12a90 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
12aa0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
12ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12af0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
12b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b40 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
12b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b60 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63   Begin flock Loc
12b70 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
12b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b90 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20  *****.**.** Use 
12ba0 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74  the flock() syst
12bb0 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69  em call to do fi
12bc0 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  le locking..**.*
12bd0 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  * flock() lockin
12be0 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69  g is like dot-fi
12bf0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  le locking in th
12c00 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  at the various.*
12c10 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63  * fine-grain loc
12c20 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70  king levels supp
12c30 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20  orted by SQLite 
12c40 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e  are collapsed in
12c50 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65  to.** a single e
12c60 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
12c70 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12c80 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
12c90 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47  , and.** PENDING
12ca0 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73   locks are the s
12cb0 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20  ame thing as an 
12cc0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
12cd0 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c   SQLite.** still
12ce0 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20   works when you 
12cf0 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e  do this, but con
12d00 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75  currency is redu
12d10 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c  ced since.** onl
12d20 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
12d30 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ss can be readin
12d40 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  g the database a
12d50 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  t a time..**.** 
12d60 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f  Omit this sectio
12d70 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  n if SQLITE_ENAB
12d80 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
12d90 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a   is turned off.*
12da0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
12db0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
12dc0 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  E../*.** Retry f
12dd0 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61  lock() calls tha
12de0 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54  t fail with EINT
12df0 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54  R.*/.#ifdef EINT
12e00 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  R.static int rob
12e10 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64  ust_flock(int fd
12e20 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74  , int op){.  int
12e30 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
12e40 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77  flock(fd,op); }w
12e50 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
12e60 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
12e70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
12e80 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75  se.# define robu
12e90 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c  st_flock(a,b) fl
12ea0 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a  ock(a,b).#endif.
12eb0 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69       ../*.** Thi
12ec0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
12ed0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
12ee0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
12ef0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
12f00 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
12f10 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
12f20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
12f30 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
12f40 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
12f50 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
12f60 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
12f70 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
12f80 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
12f90 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
12fa0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
12fb0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
12fc0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
12fd0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
12fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ff0 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
13000 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
13010 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
13020 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
13030 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13040 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
13050 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
13060 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13070 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
13080 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
13090 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
130a0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
130b0 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
130c0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
130d0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
130e0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
130f0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13100 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13110 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13120 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
13130 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
13140 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
13150 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
13160 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
13170 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
13180 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
13190 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
131a0 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
131b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
131c0 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
131d0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
131e0 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
131f0 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
13200 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
13210 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
13220 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62  .      lrc = rob
13230 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13240 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
13250 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
13260 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
13270 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
13280 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
13290 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
132a0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
132b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
132c0 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20  R_UNLOCK; .     
132d0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
132e0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
132f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
13300 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
13310 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
13320 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
13330 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
13340 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
13350 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
13360 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
13370 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
13380 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
13390 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
133a0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
133b0 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
133c0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
133d0 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
133e0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
133f0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
13400 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
13410 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
13420 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13430 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
13440 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
13450 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
13460 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
13470 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
13480 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13490 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
134a0 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45   0xff) == SQLITE
134b0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
134c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
134d0 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
134e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
134f0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13500 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13510 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
13520 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
13530 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
13540 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
13550 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
13560 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
13570 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
13580 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
13590 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
135a0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
135b0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
135c0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
135d0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
135e0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
135f0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
13600 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
13610 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
13620 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
13630 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
13640 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
13650 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
13660 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
13670 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
13680 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
13690 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
136a0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
136b0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
136c0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
136d0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
136e0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
136f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
13700 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
13710 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
13720 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
13730 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
13740 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
13750 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
13760 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
13770 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
13780 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
13790 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
137a0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
137b0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
137c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
137d0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
137e0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
137f0 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
13800 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
13810 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
13820 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
13830 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
13840 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
13850 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
13860 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
13870 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
13880 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
13890 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
138a0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
138b0 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
138c0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
138d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
138e0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
138f0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
13900 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
13910 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
13920 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
13930 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
13940 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
13950 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
13960 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13970 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13980 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13990 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
139a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
139b0 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
139c0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
139d0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
139e0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
139f0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
13a00 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
13a10 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
13a20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
13a30 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
13a40 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
13a50 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
13a60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13a70 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13a90 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
13aa0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13ab0 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
13ac0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13ad0 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
13ae0 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
13af0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
13b00 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
13b10 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
13b20 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
13b30 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13b40 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13b50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
13b60 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
13b70 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
13b80 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
13b90 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
13ba0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rno);.    }.  } 
13bb0 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
13bc0 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
13bd0 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
13be0 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
13bf0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13c00 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
13c10 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
13c20 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
13c30 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
13c40 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
13c50 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
13c60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
13c70 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
13c80 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
13c90 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13ca0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
13cb0 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53  (rc & 0xff) == S
13cc0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
13cd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
13ce0 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
13cf0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
13d00 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13d10 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
13d20 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
13d30 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
13d40 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
13d50 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
13d60 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
13d70 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
13d80 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
13d90 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
13da0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
13db0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
13dc0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
13dd0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
13de0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
13df0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
13e00 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
13e10 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13e20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
13e30 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
13e40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13e50 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13e60 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13e70 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13e80 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
13e90 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
13ea0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
13eb0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
13ec0 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
13ed0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
13ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13ef0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f  le->eFileLock, o
13f00 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
13f10 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
13f20 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
13f30 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
13f40 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
13f50 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
13f60 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
13f70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13f80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13f90 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
13fa0 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
13fb0 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
13fc0 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
13fd0 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
13fe0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
13ff0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
14000 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
14010 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
14020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14030 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
14040 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
14050 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63   if( robust_floc
14060 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
14070 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53  _UN) ){.#ifdef S
14080 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
14090 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
140a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
140b0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  _OK;.#endif /* S
140c0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
140d0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
140e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
140f0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
14100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14110 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14120 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
14130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14140 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
14150 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
14160 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
14170 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
14180 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73 65 72  e *id) {.  asser
14190 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 66 6c  t( id!=0 );.  fl
141a0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
141b0 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e  _LOCK);.  return
141c0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
141d0 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  d);.}..#endif /*
141e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
141f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
14200 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
14210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14220 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
14230 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
14240 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
14250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
142b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
142c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14310 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
14320 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
14330 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
14340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14350 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
14360 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
14370 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
14380 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
14390 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
143a0 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
143b0 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
143c0 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
143d0 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
143e0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
143f0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
14400 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
14410 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
14420 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14430 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
14440 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
14450 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
14460 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
14470 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
14480 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
14490 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
144a0 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
144b0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
144c0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
144d0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
144e0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
144f0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
14500 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
14510 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
14520 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
14530 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
14540 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
14550 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
14560 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
14570 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
14580 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
14590 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
145a0 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
145b0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
145c0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
145d0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
145e0 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
145f0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
14600 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
14610 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
14620 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14630 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
14640 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
14650 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14660 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
14670 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
14680 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
14690 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
146a0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
146b0 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
146c0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
146d0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
146e0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
146f0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
14700 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
14710 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
14720 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
14730 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
14740 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
14750 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
14760 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
14770 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
14780 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
14790 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
147a0 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73  pSem;..    if( s
147b0 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
147c0 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
147d0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
147e0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
147f0 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
14800 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
14810 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
14820 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
14830 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
14840 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
14850 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
14860 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
14870 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65  rrno);.      } e
14880 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
14890 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
148a0 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
148b0 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
148c0 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
148d0 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
148e0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
148f0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
14900 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
14910 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
14920 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
14930 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
14940 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
14950 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
14960 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
14970 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
14980 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
14990 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
149a0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
149b0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
149c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
149d0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
149e0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
149f0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
14a00 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
14a10 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
14a20 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
14a30 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
14a40 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
14a50 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
14a60 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
14a70 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
14a80 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
14a90 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
14aa0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
14ab0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
14ac0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
14ad0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
14ae0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
14af0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
14b00 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
14b10 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
14b20 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
14b30 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
14b40 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
14b50 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
14b60 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
14b70 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
14b80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
14b90 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
14ba0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
14bb0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
14bc0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
14bd0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
14be0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
14bf0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
14c00 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
14c10 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
14c20 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14c30 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
14c40 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
14c50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14c60 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
14c70 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
14c80 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
14c90 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
14ca0 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
14cb0 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
14cc0 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
14cd0 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
14ce0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
14cf0 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
14d00 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
14d10 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
14d20 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
14d30 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
14d40 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
14d50 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
14d60 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
14d70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14d80 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
14d90 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
14da0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
14db0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
14dc0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
14dd0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
14de0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f  tatic int semXLo
14df0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14e00 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14e10 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14e20 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14e30 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
14e40 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
14e50 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
14e60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14e70 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
14e80 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
14e90 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
14ea0 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
14eb0 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
14ec0 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
14ed0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
14ee0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14ef0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
14f00 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14f10 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
14f20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14f30 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
14f40 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
14f50 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
14f60 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
14f70 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
14f80 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
14f90 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
14fa0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
14fb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14fc0 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
14fd0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
14fe0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
14ff0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
15000 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
15010 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15020 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d  eFileLock;.. sem
15030 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
15040 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15050 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
15060 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
15070 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
15080 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
15090 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
150a0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
150b0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
150c0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
150d0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
150e0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
150f0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
15100 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
15110 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
15120 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
15130 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
15140 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
15150 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28   int semXUnlock(
15160 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15170 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
15180 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
15190 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
151a0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
151b0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
151c0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
151d0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
151e0 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
151f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
15200 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
15210 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
15220 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
15230 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
15240 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15250 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
15260 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
15270 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
15280 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
15290 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
152a0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
152b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
152c0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
152d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
152e0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
152f0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
15300 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
15310 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
15320 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
15330 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15340 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
15350 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
15360 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
15370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15380 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
15390 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
153a0 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
153b0 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
153c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
153d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
153e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
153f0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
15400 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
15410 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
15420 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
15430 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
15440 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
15450 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
15460 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
15470 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
15480 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15490 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
154a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
154b0 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
154c0 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
154d0 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71  int semXClose(sq
154e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
154f0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
15500 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15510 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15520 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63  d;.    semXUnloc
15530 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
15540 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
15550 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
15560 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
15570 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
15580 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
15590 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
155a0 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
155b0 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
155c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
155d0 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
155e0 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
155f0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
15600 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
15610 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
15620 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
15630 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
15640 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
15650 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
15660 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
15670 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
15680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156c0 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
156d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15710 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15730 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
15740 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
15750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15760 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
15770 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
15780 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
15790 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
157a0 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
157b0 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
157c0 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
157d0 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
157e0 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
157f0 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
15800 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
15810 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
15820 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
15830 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
15840 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
15850 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
15860 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
15870 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
15880 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
15890 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
158a0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
158b0 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
158c0 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
158d0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
158e0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
158f0 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
15900 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
15910 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
15920 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
15930 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
15940 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
15950 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15960 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
15970 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
15980 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
15990 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
159a0 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
159b0 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
159c0 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
159d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
159e0 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
159f0 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
15a00 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
15a10 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
15a20 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
15a30 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
15a40 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
15a50 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
15a60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
15a70 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
15a80 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
15a90 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
15aa0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
15ab0 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
15ac0 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
15ad0 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
15ae0 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
15af0 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
15b20 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
15b30 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
15b40 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
15b50 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
15b60 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
15b70 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
15b80 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
15b90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
15ba0 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
15bb0 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
15bc0 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
15bd0 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
15be0 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
15bf0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
15c00 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
15c10 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
15c20 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
15c30 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
15c40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
15c50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
15c60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
15c70 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
15c80 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
15c90 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
15ca0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
15cb0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
15cc0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
15cd0 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
15ce0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
15cf0 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
15d00 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
15d10 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
15d20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
15d30 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
15d40 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
15d50 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
15d60 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
15d70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
15d80 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
15d90 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
15da0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
15db0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
15dc0 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
15dd0 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
15de0 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
15df0 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
15e00 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
15e10 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
15e20 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
15e30 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
15e40 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
15e50 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
15e60 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
15e70 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
15e80 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
15e90 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
15ea0 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
15eb0 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
15ec0 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
15ed0 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
15ee0 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
15ef0 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
15f00 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
15f10 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
15f20 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
15f30 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
15f40 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
15f50 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
15f60 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
15f70 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
15f80 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
15f90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15fa0 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
15fb0 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
15fc0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
15fd0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
15fe0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
15ff0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
16000 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
16010 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
16020 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
16050 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
16060 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
16070 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
16080 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
16090 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
160a0 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
160b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
160c0 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
160d0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
160e0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
160f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16100 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
16110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16120 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
16130 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
16140 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
16150 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
16160 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
16170 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
16180 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
16190 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
161a0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
161b0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
161c0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
161d0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
161e0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
161f0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
16200 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
16210 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
16220 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
16230 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
16240 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
16250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
16260 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
16270 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
16280 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
16290 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
162a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
162b0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
162c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
162d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
162e0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
162f0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20  text *context;. 
16300 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
16310 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
16320 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
16330 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
16340 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
16350 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d  e );.  context =
16360 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
16370 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
16380 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
16390 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
163a0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
163b0 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
163c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
163d0 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
163e0 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
163f0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
16400 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
16410 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
16420 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
16430 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
16440 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
16450 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
16460 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
16470 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
16480 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
16490 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
164a0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
164b0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
164c0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
164d0 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
164e0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
164f0 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
16500 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
16510 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
16520 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16530 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16540 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
16550 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
16560 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
16570 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
16580 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
16590 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
165a0 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
165b0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
165c0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
165d0 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
165e0 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
165f0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16600 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16610 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
16620 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
16630 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
16640 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
16650 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
16660 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
16670 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
16680 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
16690 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
166a0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
166b0 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
166c0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
166d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
166e0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
166f0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
16700 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
16710 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
16720 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
16730 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
16740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16750 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
16760 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
16770 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
16780 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
16790 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
167a0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
167b0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
167c0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
167d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
167e0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
167f0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
16800 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
16810 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
16820 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
16830 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
16840 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
16850 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
16860 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
16870 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
16880 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
16890 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
168a0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
168b0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
168c0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
168d0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
168e0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
168f0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
16900 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
16910 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
16920 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
16930 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
16940 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
16950 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
16960 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
16970 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
16980 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
16990 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
169a0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
169b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
169c0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
169d0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
169e0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
169f0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
16a00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16a10 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
16a20 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
16a30 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
16a40 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
16a50 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
16a60 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
16a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
16a80 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
16a90 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
16aa0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
16ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
16ac0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16ad0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
16ae0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
16af0 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
16b00 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
16b10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
16b20 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
16b30 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
16b40 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
16b50 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
16b60 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
16b70 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
16b80 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
16b90 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
16ba0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
16bb0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
16bc0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
16bd0 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
16be0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
16bf0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
16c00 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
16c10 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
16c20 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70  nShared , osGetp
16c30 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  id(0)));..  /* I
16c40 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
16c50 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
16c60 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
16c70 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
16c80 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
16c90 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
16ca0 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
16cb0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
16cc0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
16cd0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
16ce0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
16cf0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
16d00 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16d10 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
16d20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16d30 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
16d40 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
16d50 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16d60 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16d70 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16d80 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
16d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16da0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
16db0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
16dc0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
16dd0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
16de0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
16df0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
16e00 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
16e10 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
16e20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
16e30 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
16e40 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
16e50 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
16e60 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
16e70 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
16e80 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
16e90 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
16ea0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
16eb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
16ec0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
16ed0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
16ef0 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
16f00 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16f10 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
16f20 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16f30 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16f40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16f50 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
16f60 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
16f70 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
16f80 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
16f90 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
16fa0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
16fb0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
16fc0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
16fd0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
16fe0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
16ff0 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
17000 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
17010 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
17020 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
17030 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
17040 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
17050 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
17060 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
17070 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
17080 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
17090 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
170a0 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
170b0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
170c0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
170d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
170e0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
170f0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
17100 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
17110 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
17120 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
17130 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
17140 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
17150 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
17160 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
17170 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
17180 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
17190 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
171a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
171b0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
171c0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
171d0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
171e0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
171f0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
17200 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
17210 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
17220 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
17230 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17240 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
17250 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
17260 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
17270 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17280 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
17290 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
172a0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
172b0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
172c0 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
172d0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
172e0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
172f0 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
17300 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
17310 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
17320 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
17330 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
17340 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
17350 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
17360 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
17370 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
17380 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
17390 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
173a0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
173b0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
173c0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
173d0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
173e0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
173f0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
17400 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
17410 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
17420 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
17430 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17440 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
17450 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
17460 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
17470 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
17480 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
17490 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
174a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
174b0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
174c0 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
174d0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
174e0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
174f0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
17500 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
17510 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
17520 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
17530 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
17540 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
17550 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
17560 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
17570 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
17580 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
17590 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
175a0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
175b0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
175c0 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
175d0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
175e0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
175f0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
17600 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
17610 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
17620 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
17630 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
17640 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
17650 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
17660 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
17670 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
17680 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
17690 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
176a0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
176b0 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
176c0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
176d0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
176e0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
176f0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17700 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
17710 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17720 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17730 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
17740 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
17750 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
17760 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
17770 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
17780 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
17790 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
177a0 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
177b0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
177c0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
177d0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
177e0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
177f0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
17800 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
17810 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
17820 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45  rno(pFile, lrc1E
17830 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  rrno);.      rc 
17840 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f  = lrc1;.      go
17850 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17860 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
17870 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
17880 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  c2) ){.      rc 
17890 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f  = lrc2;.      go
178a0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
178b0 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
178c0 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f  lrc1 != SQLITE_O
178d0 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  K ) {.      rc =
178e0 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73   lrc1;.    } els
178f0 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
17900 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
17910 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
17920 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
17930 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
17940 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
17950 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
17960 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17970 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
17980 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
17990 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
179a0 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
179b0 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
179c0 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
179d0 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61   this.     ** sa
179e0 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
179f0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
17a00 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
17a10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17a20 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
17a30 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
17a40 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
17a50 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
17a60 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
17a70 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
17a80 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
17a90 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
17aa0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
17ab0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
17ac0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61     */.    int fa
17ad0 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73  iled = 0;.    as
17ae0 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
17af0 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
17b00 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e   if (eFileLock >
17b10 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
17b20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
17b30 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c  ock < RESERVED_L
17b40 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  OCK) {.        /
17b50 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
17b60 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  RVED lock */.   
17b70 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
17b80 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17b90 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17ba0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17bb0 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,1);.      if( 
17bc0 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  !failed ){.     
17bd0 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
17be0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
17bf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
17c00 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65  !failed && eFile
17c10 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56  Lock == EXCLUSIV
17c20 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
17c30 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
17c40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
17c50 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
17c60 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
17c70 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
17c80 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
17c90 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
17ca0 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
17cb0 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
17cc0 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
17cd0 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
17ce0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
17cf0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
17d00 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
17d10 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17d20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17d30 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17d50 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17d60 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20  e, 1, 0)) ){.   
17d70 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32       int failed2
17d80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17d90 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74        /* now att
17da0 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  emmpt to get the
17db0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
17dc0 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20  range */.       
17dd0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
17de0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17df0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
17e00 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17e30 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
17e40 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26      if( failed &
17e50 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70  & (failed2 = afp
17e60 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17e70 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17e90 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
17ea0 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73  IRST + pInode->s
17eb0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
17ec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
17ed0 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
17ee0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
17ef0 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
17f00 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
17f10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
17f20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
17f30 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
17f40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
17f50 28 66 61 69 6c 65 64 20 26 20 30 78 66 66 29 20  (failed & 0xff) 
17f60 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
17f70 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17f90 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
17fa0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
17fb0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
17fc0 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
17fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
17fe0 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
17ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18000 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
18010 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
18020 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
18030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18040 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
18050 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
18060 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
18070 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18080 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
18090 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
180a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
180b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
180c0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
180d0 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
180e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
180f0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
18100 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
18110 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
18120 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
18130 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
18140 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
18150 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
18160 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
18170 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
18180 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
18190 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
181a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
181b0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
181c0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
181d0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
181e0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
181f0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
18200 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
18210 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
18220 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
18230 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
18240 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
18250 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
18260 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
18270 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
18280 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
18290 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
182a0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
182b0 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
182c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
182d0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
182e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
182f0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
18300 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
18310 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
18320 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
18330 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
18340 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
18350 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
18360 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
18370 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
18380 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
18390 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
183a0 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
183b0 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
183c0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
183d0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
183e0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
183f0 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
18400 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
18410 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
18420 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
18430 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
18440 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
18450 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
18460 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
18470 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
18480 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
18490 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
184a0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
184b0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
184c0 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
184d0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
184e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
184f0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
18500 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
18510 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
18520 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
18530 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
18540 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18550 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
18560 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
18570 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
18580 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
18590 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
185a0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
185b0 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
185c0 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
185d0 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
185e0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
185f0 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
18600 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
18610 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
18620 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
18630 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
18640 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
18650 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
18660 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
18670 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
18680 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
18690 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
186a0 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
186b0 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
186c0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
186d0 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
186e0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
186f0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
18700 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
18710 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
18720 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
18730 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
18740 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
18750 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
18760 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
18770 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
18780 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
18790 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
187a0 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
187b0 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
187c0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
187d0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
187e0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
187f0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
18800 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
18810 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
18820 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
18830 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
18840 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
18850 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
18860 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
18870 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
18880 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
18890 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
188a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
188b0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
188c0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
188d0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
188e0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
188f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18900 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
18910 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
18920 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
18930 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
18940 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
18950 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
18960 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
18970 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
18980 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
18990 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
189a0 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
189b0 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
189c0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
189d0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
189e0 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
189f0 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
18a00 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
18a10 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
18a20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
18a30 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
18a40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
18a50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
18a60 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
18a70 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
18a80 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18a90 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
18aa0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
18ab0 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
18ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18ad0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18ae0 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
18af0 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
18b00 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
18b10 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
18b20 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18b30 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
18b40 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
18b50 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
18b60 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
18b70 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
18b80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18b90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18ba0 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
18bb0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
18bc0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18bd0 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
18be0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
18bf0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
18c00 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
18c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
18c20 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
18c30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
18c40 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
18c50 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
18c60 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
18c70 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
18c80 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
18c90 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
18ca0 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
18cb0 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
18cc0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
18cd0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
18ce0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
18cf0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
18d00 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
18d10 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
18d20 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
18d30 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
18d40 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
18d50 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
18d60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18d70 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
18d80 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
18d90 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
18da0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18db0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
18dc0 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
18dd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
18de0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18df0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18e00 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
18e10 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
18e20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
18e30 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
18e40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
18e50 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
18e60 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18e70 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
18e80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18ea0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
18eb0 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
18ec0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
18ed0 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
18ee0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
18ef0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
18f00 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
18f10 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
18f20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
18f30 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
18f40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18f50 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
18f60 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
18f70 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
18f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
18f90 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
18fa0 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
18fb0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
18fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
18fd0 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
18fe0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
18ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19000 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
19010 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
19020 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  id;.  assert( id
19030 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f  !=0 );.  afpUnlo
19040 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
19050 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
19060 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
19070 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
19080 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
19090 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
190a0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
190b0 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
190c0 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
190d0 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
190e0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
190f0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
19100 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
19110 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
19120 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
19130 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
19140 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
19150 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
19160 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
19170 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
19180 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
19190 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
191a0 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
191b0 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
191c0 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
191d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
191e0 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
191f0 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20  gContext);.  rc 
19200 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
19210 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
19220 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
19230 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
19240 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
19250 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
19260 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19270 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
19280 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
19290 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
192a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
192b0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
192c0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
192d0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
192e0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
192f0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
19300 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
19310 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
19320 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
19330 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
19340 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
19350 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
19360 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19380 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
19390 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
193a0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
193c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19470 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
19480 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
19490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
194b0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
194c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
194d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
194e0 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
194f0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
19500 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
19510 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
19520 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
19530 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
19540 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
19550 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
19560 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
19570 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
19580 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
19590 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
195a0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
195b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
195c0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
195d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
195e0 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
195f0 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
19600 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19610 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
19620 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
19630 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
19640 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
19650 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
19660 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
19670 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
19680 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
19690 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
196a0 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
196b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
196c0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
196d0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
196e0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
196f0 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
19700 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
19710 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
19720 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
19730 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
19740 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
19750 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
19760 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
19770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19780 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
19790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197d0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
197e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19820 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
19830 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
19840 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
19850 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
19860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19870 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
19880 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
19890 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
198a0 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
198b0 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
198c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
198d0 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
198e0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
198f0 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
19900 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
19910 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
19920 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
19930 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
19940 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
19950 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
19960 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
19970 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
19980 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
19990 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
199a0 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
199b0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
199c0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
199d0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
199e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
199f0 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
19a00 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
19a10 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19a20 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
19a30 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
19a40 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
19a50 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
19a60 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
19a70 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
19a80 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
19a90 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
19aa0 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
19ab0 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
19ac0 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
19ad0 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
19ae0 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
19af0 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
19b00 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e  E_PREAD.** in an
19b10 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
19b20 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
19b30 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
19b40 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
19b50 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
19b60 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
19b70 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
19b80 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
19b90 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
19ba0 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
19bb0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
19bc0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
19bd0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
19be0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
19bf0 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
19c00 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
19c10 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
19c20 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
19c30 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72  nt got;.  int pr
19c40 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64  ior = 0;.#if (!d
19c50 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19c60 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
19c70 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
19c80 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
19c90 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
19ca0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  T;.  assert( cnt
19cb0 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
19cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  );.  assert( id-
19cd0 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69  >h>2 );.  do{.#i
19ce0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
19cf0 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  EAD).    got = o
19d00 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
19d10 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
19d20 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
19d30 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
19d40 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
19d50 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
19d60 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36    got = osPread6
19d70 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
19d80 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
19d90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19da0 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
19db0 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  lse.    newOffse
19dc0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
19dd0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
19de0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
19df0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
19e00 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  et = -1 );.    i
19e10 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29  f( newOffset<0 )
19e20 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
19e30 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
19e40 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
19e50 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19e60 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
19e70 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
19e80 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
19e90 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
19ea0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
19eb0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
19ec0 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
19ed0 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
19ee0 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
19ef0 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
19f00 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
19f10 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
19f20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
19f30 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
19f40 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
19f50 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
19f60 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
19f70 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
19f80 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
19f90 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
19fa0 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
19fb0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
19fc0 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
19fd0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
19fe0 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
19ff0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1a000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
1a010 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
1a020 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
1a030 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
1a040 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
1a050 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1a060 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1a070 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1a080 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1a090 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1a0a0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1a0b0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1a0c0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1a0d0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1a0e0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1a0f0 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1a100 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a110 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1a120 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1a130 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1a140 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1a150 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1a160 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1a170 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1a180 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1a190 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
1a1a0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1a1b0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1a1c0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1a1d0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1a1e0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1a1f0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1a200 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1a210 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1a220 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1a230 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1a240 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1a250 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50  ssert( pFile->pP
1a260 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
1a270 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1a280 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1a290 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1a2a0 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1a2b0 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1a2c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1a2d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1a2e0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1a2f0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1a300 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
1a310 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1a320 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1a330 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1a340 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1a350 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1a360 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1a370 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1a380 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1a390 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1a3a0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1a3b0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
1a3c0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1a3d0 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1a3e0 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  ], amt);.      r
1a3f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a410 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1a420 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1a430 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1a440 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
1a450 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1a460 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1a470 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1a480 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1a490 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1a4a0 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1a4b0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1a4c0 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1a4d0 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
1a4e0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1a4f0 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1a500 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
1a510 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
1a520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a530 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
1a540 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
1a550 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1a560 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
1a570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a580 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
1a590 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  e{.    storeLast
1a5a0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b  Errno(pFile, 0);
1a5b0 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74     /* not a syst
1a5c0 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1a5d0 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
1a5e0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
1a5f0 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
1a600 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
1a610 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
1a620 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
1a630 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a640 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1a650 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
1a660 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
1a670 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63  ek the file-desc
1a680 72 69 70 74 6f 72 20 70 61 73 73 65 64 20 61 73  riptor passed as
1a690 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1a6a0 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75  ent to.** absolu
1a6b0 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20  te offset iOff, 
1a6c0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  then attempt to 
1a6d0 77 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  write nBuf bytes
1a6e0 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a   of data from.**
1a6f0 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20   pBuf to it. If 
1a700 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1a710 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73   return -1 and s
1a720 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68  et *piErrno. Oth
1a730 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75  erwise, .** retu
1a740 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75  rn the actual nu
1a750 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
1a760 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79  itten (which may
1a770 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a   be less than.**
1a780 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69   nBuf)..*/.stati
1a790 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1a7a0 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20  teFd(.  int fd, 
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1a7d0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72  descriptor to wr
1a7e0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
1a7f0 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20  iOff,           
1a800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a810 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  ile offset to be
1a820 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
1a830 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1a840 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1a850 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1a860 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65   from this buffe
1a870 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  r to the file */
1a880 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20  .  int nBuf,    
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
1a8b0 66 66 65 72 20 70 42 75 66 20 69 6e 20 62 79 74  ffer pBuf in byt
1a8c0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45  es */.  int *piE
1a8d0 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  rrno            
1a8e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1a8f0 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20  Error number if 
1a900 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
1a910 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a930 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1a940 74 75 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d  turned by system
1a950 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   call */..  asse
1a960 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26  rt( nBuf==(nBuf&
1a970 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73  0x1ffff) );.  as
1a980 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20  sert( fd>2 );.  
1a990 61 73 73 65 72 74 28 20 70 69 45 72 72 6e 6f 21  assert( piErrno!
1a9a0 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20  =0 );.  nBuf &= 
1a9b0 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52  0x1ffff;.  TIMER
1a9c0 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66  _START;..#if def
1a9d0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
1a9e0 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29    do{ rc = (int)
1a9f0 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75  osPwrite(fd, pBu
1aa00 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20  f, nBuf, iOff); 
1aa10 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1aa20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1aa30 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
1aa40 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b  E_PREAD64).  do{
1aa50 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72   rc = (int)osPwr
1aa60 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20  ite64(fd, pBuf, 
1aa70 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69  nBuf, iOff);}whi
1aa80 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1aa90 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
1aaa0 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69  .  do{.    i64 i
1aab0 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c  Seek = lseek(fd,
1aac0 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29   iOff, SEEK_SET)
1aad0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1aae0 45 72 72 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d  Error( iSeek = -
1aaf0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65  1 );.    if( iSe
1ab00 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ek<0 ){.      rc
1ab10 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65   = -1;.      bre
1ab20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
1ab30 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70   = osWrite(fd, p
1ab40 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77  Buf, nBuf);.  }w
1ab50 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1ab60 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
1ab70 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e  ndif..  TIMER_EN
1ab80 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  D;.  OSTRACE(("W
1ab90 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
1aba0 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66  %7lld %llu\n", f
1abb0 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d  d, rc, iOff, TIM
1abc0 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20  ER_ELAPSED));.. 
1abd0 20 69 66 28 20 72 63 3c 30 20 29 20 2a 70 69 45   if( rc<0 ) *piE
1abe0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1abf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1ac00 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
1ac10 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
1ac20 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
1ac30 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
1ac40 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
1ac50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1ac60 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
1ac70 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
1ac80 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
1ac90 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1aca0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1acb0 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
1acc0 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
1acd0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
1ace0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1acf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1ad00 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
1ad10 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
1ad20 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
1ad30 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
1ad40 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e  .  return seekAn
1ad50 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20  dWriteFd(id->h, 
1ad60 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e  offset, pBuf, cn
1ad70 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e  t, &id->lastErrn
1ad80 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  o);.}.../*.** Wr
1ad90 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
1ada0 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
1adb0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1adc0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1add0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
1ade0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
1adf0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
1ae00 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
1ae10 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1ae20 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
1ae30 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
1ae40 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
1ae50 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
1ae60 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1ae70 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1ae80 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
1ae90 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1aea0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1aeb0 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
1aec0 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1aed0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1aee0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1aef0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1af00 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1af10 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1af20 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1af30 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1af40 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1af50 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1af60 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
1af70 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20  atedUnused==0.  
1af80 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1af90 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1afa0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1afb0 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1afc0 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1afd0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1afe0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
1aff0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1b000 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1b010 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1b020 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
1b030 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1b040 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1b050 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1b060 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1b070 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
1b080 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
1b090 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
1b0a0 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
1b0b0 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
1b0c0 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1b0d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1b0e0 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
1b0f0 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
1b100 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
1b110 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1b120 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
1b130 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
1b140 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
1b150 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1b160 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
1b170 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
1b180 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
1b190 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
1b1a0 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
1b1b0 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
1b1c0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1b1d0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1b1e0 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
1b1f0 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
1b200 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
1b210 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1b220 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
1b230 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
1b240 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
1b250 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
1b260 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
1b270 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
1b280 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1b290 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
1b2a0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
1b2b0 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
1b2c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1b2d0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1b2e0 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ed(SQLITE_MMAP_R
1b2f0 45 41 44 57 52 49 54 45 29 20 26 26 20 53 51 4c  EADWRITE) && SQL
1b300 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1b310 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1b320 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1b330 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1b340 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1b350 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1b360 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1b370 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1b380 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1b390 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1b3a0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1b3b0 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1b3c0 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1b3d0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1b3e0 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1b3f0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1b400 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1b410 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1b420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b440 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1b450 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1b460 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1b470 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1b480 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1b490 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1b4a0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1b4b0 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1b4c0 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1b4d0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1b4e0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1b4f0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1b500 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68 69  }.#endif. .  whi
1b510 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65 65  le( (wrote = see
1b520 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1b530 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1b540 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f 74  mt))<amt && wrot
1b550 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  e>0 ){.    amt -
1b560 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
1b570 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
1b580 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
1b590 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
1b5a0 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
1b5b0 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
1b5c0 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
1b5d0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
1b5e0 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
1b5f0 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66   amt=1 ));..  if
1b600 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20  ( amt>wrote ){. 
1b610 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26     if( wrote<0 &
1b620 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  & pFile->lastErr
1b630 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20  no!=ENOSPC ){.  
1b640 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
1b650 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
1b660 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
1b670 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b680 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
1b690 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  se{.      storeL
1b6a0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1b6b0 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73  0); /* not a sys
1b6c0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
1b6d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b6e0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
1b6f0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1b700 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
1b710 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
1b720 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1b730 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
1b740 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
1b750 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1b760 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
1b770 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
1b780 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
1b790 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
1b7a0 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
1b7b0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
1b7c0 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
1b7d0 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
1b7e0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1b7f0 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
1b800 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
1b810 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
1b820 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
1b830 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
1b840 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
1b850 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
1b860 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69  ck with the (sli
1b870 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a  ghtly slower).**
1b880 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75   fsync(). If you
1b890 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20   know that your 
1b8a0 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70  system does supp
1b8b0 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  ort fdatasync() 
1b8c0 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68  correctly,.** th
1b8d0 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c  en simply compil
1b8e0 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79  e with -Dfdatasy
1b8f0 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20  nc=fdatasync or 
1b900 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  -DHAVE_FDATASYNC
1b910 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
1b920 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21  (fdatasync) && !
1b930 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23  HAVE_FDATASYNC.#
1b940 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e   define fdatasyn
1b950 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a  c fsync.#endif..
1b960 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56  /*.** Define HAV
1b970 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30  E_FULLFSYNC to 0
1b980 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20   or 1 depending 
1b990 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1b9a0 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46  t.** the F_FULLF
1b9b0 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
1b9c0 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53  fined.  F_FULLFS
1b9d0 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79  YNC is currently
1b9e0 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  .** only availab
1b9f0 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20  le on Mac OS X. 
1ba00 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20   But that could 
1ba10 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  change..*/.#ifde
1ba20 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20  f F_FULLFSYNC.# 
1ba30 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1ba40 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20  FSYNC 1.#else.# 
1ba50 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1ba60 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a  FSYNC 0.#endif..
1ba70 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63  ./*.** The fsync
1ba80 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64  () system call d
1ba90 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20  oes not work as 
1baa0 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61  advertised on ma
1bab0 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65  ny.** unix syste
1bac0 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ms.  The followi
1bad0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  ng procedure is 
1bae0 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  an attempt to ma
1baf0 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65  ke.** it work be
1bb00 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tter..**.** The 
1bb10 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d  SQLITE_NO_SYNC m
1bb20 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c  acro disables al
1bb30 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69  l fsync()s.  Thi
1bb40 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66  s is useful.** f
1bb50 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20  or testing when 
1bb60 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74  we want to run t
1bb70 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20  hrough the test 
1bb80 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a  suite quickly..*
1bb90 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67  * You are strong
1bba0 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a  ly advised *not*
1bbb0 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20   to deploy with 
1bbc0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a  SQLITE_NO_SYNC.*
1bbd0 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76  * enabled, howev
1bbe0 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53  er, since with S
1bbf0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e  QLITE_NO_SYNC en
1bc00 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61  abled, an OS cra
1bc10 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  sh.** or power f
1bc20 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65  ailure will like
1bc30 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
1bc40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1bc50 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20  .** SQLite sets 
1bc60 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
1bc70 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  g if the size of
1bc80 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63   the file is unc
1bc90 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69  hanged..** The i
1bca0 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f  dea behind dataO
1bcb0 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73  nly is that it s
1bcc0 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65  hould only write
1bcd0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e   the file conten
1bce0 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f  t.** to disk, no
1bcf0 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65  t the inode.  We
1bd00 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e   only set dataOn
1bd10 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ly if the file s
1bd20 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61  ize is .** uncha
1bd30 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66  nged since the f
1bd40 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74  ile size is part
1bd50 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20   of the inode.  
1bd60 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64  However, .** Ted
1bd70 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74   Ts'o tells us t
1bd80 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
1bd90 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20  will also write 
1bda0 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65  the inode if the
1bdb0 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61  .** file size ha
1bdc0 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20  s changed.  The 
1bdd0 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72  only real differ
1bde0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61  ence between fda
1bdf0 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20  tasync().** and 
1be00 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c  fsync(), Ted tel
1be10 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66  ls us, is that f
1be20 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1be30 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a  not flush the.**
1be40 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74   inode if the mt
1be50 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20  ime or owner or 
1be60 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72  other inode attr
1be70 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e  ibutes have chan
1be80 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20  ged..** We only 
1be90 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66  care about the f
1bea0 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68  ile size, not th
1beb0 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74  e other file att
1bec0 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61  ributes, so.** a
1bed0 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20  s far as SQLite 
1bee0 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e  is concerned, an
1bef0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20   fdatasync() is 
1bf00 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e  always adequate.
1bf10 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79  .** So, we alway
1bf20 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28  s use fdatasync(
1bf30 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  ) if it is avail
1bf40 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73  able, regardless
1bf50 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   of.** the value
1bf60 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79   of the dataOnly
1bf70 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   flag..*/.static
1bf80 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
1bf90 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
1bfa0 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
1bfb0 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
1bfc0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1bfd0 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
1bfe0 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
1bff0 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
1c000 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
1c010 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
1c020 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
1c030 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
1c040 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
1c050 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
1c060 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
1c070 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
1c080 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
1c090 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1c0a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c0b0 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
1c0c0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1c0d0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1c0e0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1c0f0 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
1c100 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
1c110 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1c120 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
1c130 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c140 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1c150 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1c160 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66  ataOnly);.#endif
1c170 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
1c180 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
1c190 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e  s that we do a n
1c1a0 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e  ormal fsync() an
1c1b0 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43  d .  ** FULLSYNC
1c1c0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1c1d0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74  during testing t
1c1e0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
1c1f0 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  is procedure.  *
1c200 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69  * gets called wi
1c210 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  th the correct a
1c220 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23  rguments..  */.#
1c230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1c240 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  T.  if( fullSync
1c250 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73   ) sqlite3_fulls
1c260 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ync_count++;.  s
1c270 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1c280 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
1c290 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
1c2a0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
1c2b0 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
1c2c0 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
1c2d0 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42 75  .  ** no-op.  Bu
1c2e0 74 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 63  t go ahead and c
1c2f0 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 76  all fstat() to v
1c300 61 6c 69 64 61 74 65 20 74 68 65 20 66 69 6c 65  alidate the file
1c310 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
1c320 20 61 73 20 77 65 20 6e 65 65 64 20 61 20 6d 65   as we need a me
1c330 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20  thod to provoke 
1c340 61 20 66 61 69 6c 75 72 65 20 64 75 72 69 6e 67  a failure during
1c350 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74 65 20 74  .  ** coverate t
1c360 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69 66  esting..  */.#if
1c370 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1c380 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63  NC.  {.    struc
1c390 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
1c3a0 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
1c3b0 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69   &buf);.  }.#eli
1c3c0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1c3d0 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1c3e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ){.    rc = osFc
1c3f0 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
1c400 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  YNC, 0);.  }else
1c410 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1c420 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1c430 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1c440 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1c450 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1c460 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1c470 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1c480 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1c490 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1c4a0 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1c4b0 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1c4c0 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1c4d0 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1c4e0 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1c4f0 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1c500 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1c510 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1c520 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1c530 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1c540 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1c550 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1c560 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1c570 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1c580 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1c590 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1c5a0 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1c5b0 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1c5c0 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1c5d0 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1c5e0 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1c5f0 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1c600 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1c610 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1c620 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1c630 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1c640 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1c650 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1c660 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1c670 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1c680 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1c690 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1c6a0 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1c6b0 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1c6c0 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1c6d0 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1c6e0 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1c6f0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1c700 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1c710 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1c720 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1c730 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1c740 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1c750 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1c760 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1c770 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1c780 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1c790 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1c7a0 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1c7b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c7c0 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1c7d0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1c7e0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1c7f0 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1c800 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1c810 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1c820 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1c830 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1c840 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1c850 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1c860 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c870 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1c880 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1c890 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1c8a0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1c8b0 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1c8c0 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1c8d0 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1c8e0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1c8f0 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1c900 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1c910 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1c920 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1c930 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1c940 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1c950 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1c960 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1c970 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1c980 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1c990 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1c9a0 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1c9b0 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1c9c0 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1c9d0 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1c9e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c9f0 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1ca00 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1ca10 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1ca20 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1ca30 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1ca40 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1ca50 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1ca60 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1ca70 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1ca80 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1ca90 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1caa0 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1cab0 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1cac0 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1cad0 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1cae0 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1caf0 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1cb00 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1cb10 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1cb20 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1cb30 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1cb40 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1cb50 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1cb60 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1cb70 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1cb80 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1cb90 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1cba0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1cbb0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1cbc0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1cbd0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1cbe0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1cbf0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1cc00 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1cc10 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1cc20 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1cc30 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1cc40 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1cc50 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1cc60 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1cc70 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1cc80 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1cc90 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1cca0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1ccb0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1ccc0 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1ccd0 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1cce0 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d   ii>0 && zDirnam
1ccf0 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1cd00 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1cd10 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1cd20 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73  ] = '\0';.  }els
1cd30 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e  e{.    if( zDirn
1cd40 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44  ame[0]!='/' ) zD
1cd50 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b  irname[0] = '.';
1cd60 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d  .    zDirname[1]
1cd70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d   = 0;.  }.  fd =
1cd80 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1cd90 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1cda0 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1cdb0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
1cdc0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1cdd0 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1cde0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1cdf0 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1ce00 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65    if( fd>=0 ) re
1ce10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ce20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1ce30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1ce40 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1ce50 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69  nDirectory", zDi
1ce60 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rname);.}../*.**
1ce70 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1ce80 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1ce90 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1cea0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1ceb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1cec0 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1ced0 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1cee0 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1cef0 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1cf00 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1cf10 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1cf20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1cf30 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1cf40 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1cf50 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1cf60 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1cf70 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1cf80 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1cf90 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
1cfa0 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
1cfb0 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
1cfc0 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
1cfd0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
1cfe0 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
1cff0 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
1d000 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
1d010 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
1d020 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
1d030 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1d040 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
1d050 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
1d060 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
1d070 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
1d080 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
1d090 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
1d0a0 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
1d0b0 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
1d0c0 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1d0d0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1d0e0 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
1d0f0 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
1d100 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1d110 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
1d120 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
1d130 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
1d140 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
1d150 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
1d160 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1d170 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
1d180 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
1d190 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1d1a0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
1d1b0 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
1d1c0 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
1d1d0 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
1d1e0 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
1d1f0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1d200 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
1d210 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1d220 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
1d230 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
1d240 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
1d250 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
1d260 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1d270 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
1d280 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
1d290 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1d2a0 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
1d2b0 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
1d2c0 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
1d2d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1d2e0 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
1d2f0 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
1d300 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
1d310 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
1d320 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
1d330 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
1d340 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1d350 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1d360 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
1d370 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
1d380 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
1d390 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
1d3a0 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
1d3b0 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
1d3c0 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
1d3d0 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
1d3e0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1d3f0 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
1d400 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1d410 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1d420 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
1d430 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1d440 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
1d450 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
1d460 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
1d470 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
1d480 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1d490 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
1d4a0 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
1d4b0 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
1d4c0 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
1d4d0 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
1d4e0 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
1d4f0 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
1d500 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
1d510 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
1d520 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
1d530 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
1d540 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
1d550 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
1d560 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
1d570 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
1d580 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
1d590 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
1d5a0 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
1d5b0 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
1d5c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
1d5d0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
1d5e0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
1d5f0 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
1d600 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
1d610 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
1d620 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
1d630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  OK ){.      full
1d650 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
1d660 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73   0);.      robus
1d670 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
1d680 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1d690 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d6a0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1d6b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b  LITE_CANTOPEN );
1d6c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d6d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1d6e0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1d6f0 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44  s &= ~UNIXFILE_D
1d700 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65  IRSYNC;.  }.  re
1d710 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d720 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1d730 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1d740 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1d750 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1d760 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1d770 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1d780 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1d790 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1d7a0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1d7b0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1d7c0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1d7d0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1d7e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1d7f0 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1d800 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1d810 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1d820 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1d830 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1d840 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1d850 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1d860 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1d870 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1d880 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1d890 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1d8a0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1d8b0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1d8c0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1d8d0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1d8e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1d8f0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1d900 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1d910 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1d920 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1d930 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1d940 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1d950 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1d960 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1d970 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
1d980 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
1d990 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1d9a0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
1d9b0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1d9c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1d9d0 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1d9e0 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1d9f0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1da00 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1da10 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1da20 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1da30 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1da40 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1da50 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1da60 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1da70 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1da80 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1da90 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1daa0 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1dab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1dac0 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1dad0 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1dae0 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1daf0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1db00 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1db10 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1db20 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1db30 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1db40 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1db50 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1db60 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1db70 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1db80 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1db90 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1dba0 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1dbb0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1dbc0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1dbd0 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1dbe0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1dbf0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1dc00 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
1dc10 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
1dc20 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
1dc30 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
1dc40 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
1dc50 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
1dc60 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
1dc70 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
1dc80 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
1dc90 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
1dca0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
1dcb0 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
1dcc0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
1dcd0 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
1dce0 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
1dcf0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
1dd00 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1dd10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
1dd20 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
1dd30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1dd40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dd50 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1dd60 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1dd70 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1dd80 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1dd90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1dda0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1ddb0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1ddc0 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1ddd0 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1dde0 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1ddf0 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1de00 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1de10 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1de20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1de30 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1de40 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
1de50 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1de60 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1de70 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
1de80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1de90 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1dea0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1deb0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1dec0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1ded0 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1dee0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1def0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1df00 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1df10 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1df20 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1df30 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1df40 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1df50 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1df60 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1df70 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1df80 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1df90 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1dfa0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1dfb0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1dfc0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1dfd0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1dfe0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1dff0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1e000 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1e010 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1e020 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1e030 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e040 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1e050 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1e060 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1e070 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1e080 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1e090 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1e0a0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1e0b0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1e0c0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1e0d0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1e0e0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1e0f0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1e100 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1e110 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e120 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1e130 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1e140 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1e150 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1e160 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1e170 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1e180 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1e190 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1e1a0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1e1b0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1e1c0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1e1d0 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1e1e0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1e1f0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1e200 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1e210 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1e220 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1e230 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1e240 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e250 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1e260 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1e270 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1e280 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1e290 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1e2a0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1e2b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1e2c0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1e2d0 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1e2e0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1e2f0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1e300 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
1e310 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1e320 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  FSTAT;.    }..  
1e330 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
1e340 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
1e350 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
1e360 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1e370 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
1e380 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
1e390 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64  t_size ){..#if d
1e3a0 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
1e3b0 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
1e3c0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1e3d0 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68  CATE.      /* Th
1e3e0 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20  e code below is 
1e3f0 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74  handling the ret
1e400 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46  urn value of osF
1e410 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20  allocate() .    
1e420 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
1e430 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1e440 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
1e450 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e  "returns zero on
1e460 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20   success, .     
1e470 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
1e480 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75  number on  failu
1e490 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e  re". See the man
1e4a0 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73  page for details
1e4b0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  . */.      int e
1e4c0 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rr;.      do{.  
1e4d0 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61        err = osFa
1e4e0 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  llocate(pFile->h
1e4f0 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e  , buf.st_size, n
1e500 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65  Size-buf.st_size
1e510 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1e520 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20   err==EINTR );. 
1e530 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72       if( err ) r
1e540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e550 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1e560 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1e570 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1e580 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1e590 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69  (), fake it. Wri
1e5a0 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73  te a .      ** s
1e5b0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
1e5c0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1e5d0 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66  ach block that f
1e5e0 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20  alls entirely.  
1e5f0 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
1e600 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1e610 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75  n. Then, if requ
1e620 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62  ired, a single b
1e630 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  yte.      ** at 
1e640 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29  offset (nSize-1)
1e650 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  , to set the siz
1e660 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
1e670 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
1e680 2a 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69  * This is a simi
1e690 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f  lar technique to
1e6a0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c   that used by gl
1e6b0 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20  ibc on systems. 
1e6c0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20       ** that do 
1e6d0 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1e6e0 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c  fallocate() call
1e6f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e700 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1e710 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1e720 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1e730 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1e740 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20  int nWrite = 0; 
1e750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e760 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1e770 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e  ritten by seekAn
1e780 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1e790 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e7b0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1e7c0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1e7d0 20 69 57 72 69 74 65 20 3d 20 28 62 75 66 2e 73   iWrite = (buf.s
1e7e0 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c  t_size/nBlk)*nBl
1e7f0 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20  k + nBlk - 1;.  
1e800 20 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69      assert( iWri
1e810 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20  te>=buf.st_size 
1e820 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e830 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c   ((iWrite+1)%nBl
1e840 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  k)==0 );.      f
1e850 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57  or(/*no-op*/; iW
1e860 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d  rite<nSize+nBlk-
1e870 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20  1; iWrite+=nBlk 
1e880 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1e890 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69  Write>=nSize ) i
1e8a0 57 72 69 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20  Write = nSize - 
1e8b0 31 3b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74  1;.        nWrit
1e8c0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1e8d0 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1e8e0 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1e8f0 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1e900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e910 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1e920 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1e930 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
1e940 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1e950 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1e960 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42  pSizeMax>0 && nB
1e970 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte>pFile->mmapS
1e980 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ize ){.    int r
1e990 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  c;.    if( pFile
1e9a0 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a  ->szChunk<=0 ){.
1e9b0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
1e9c0 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1e9d0 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
1e9e0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
1e9f0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1ea00 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  no);.        ret
1ea10 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1ea20 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1ea30 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1ea40 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1ea50 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1ea60 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  }..    rc = unix
1ea70 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e  Mapfile(pFile, n
1ea80 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Byte);.    retur
1ea90 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
1eaa0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1eab0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1eac0 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1ead0 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
1eae0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
1eaf0 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
1eb00 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
1eb10 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1eb20 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
1eb30 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1eb40 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
1eb50 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
1eb60 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
1eb70 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
1eb80 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
1eb90 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
1eba0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f  atic void unixMo
1ebb0 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a  deBit(unixFile *
1ebc0 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
1ebd0 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
1ebe0 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
1ebf0 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
1ec00 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
1ec10 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
1ec20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
1ec30 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
1ec40 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1ec50 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
1ec60 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
1ec70 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
1ec80 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
1ec90 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1eca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1ecb0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
1ecc0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1ecd0 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  uf);../*.** Info
1ece0 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
1ecf0 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
1ed00 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
1ed10 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1ed20 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1ed30 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1ed40 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1ed50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1ed60 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1ed70 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
1ed80 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
1ed90 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
1eda0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1edb0 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
1edc0 5f 57 52 49 54 45 29 0a 20 20 20 20 63 61 73 65  _WRITE).    case
1edd0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 45   SQLITE_FCNTL_BE
1ede0 47 49 4e 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  GIN_ATOMIC_WRITE
1edf0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
1ee00 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65   = osIoctl(pFile
1ee10 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 53 54  ->h, F2FS_IOC_ST
1ee20 41 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  ART_ATOMIC_WRITE
1ee30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ee40 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc ? SQLITE_IOER
1ee50 52 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43 20 3a  R_BEGIN_ATOMIC :
1ee60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ee70 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1ee80 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41  E_FCNTL_COMMIT_A
1ee90 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20  TOMIC_WRITE: {. 
1eea0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73       int rc = os
1eeb0 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Ioctl(pFile->h, 
1eec0 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f  F2FS_IOC_COMMIT_
1eed0 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20  ATOMIC_WRITE);. 
1eee0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1eef0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f   SQLITE_IOERR_CO
1ef00 4d 4d 49 54 5f 41 54 4f 4d 49 43 20 3a 20 53 51  MMIT_ATOMIC : SQ
1ef10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1ef20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ef30 43 4e 54 4c 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54  CNTL_ROLLBACK_AT
1ef40 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20  OMIC_WRITE: {.  
1ef50 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49      int rc = osI
1ef60 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  octl(pFile->h, F
1ef70 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f  2FS_IOC_ABORT_VO
1ef80 4c 41 54 49 4c 45 5f 57 52 49 54 45 29 3b 0a 20  LATILE_WRITE);. 
1ef90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1efa0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 4f   SQLITE_IOERR_RO
1efb0 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 20 3a 20  LLBACK_ATOMIC : 
1efc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1efd0 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e  .#endif /* __lin
1efe0 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45  ux__ && SQLITE_E
1eff0 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
1f000 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20  IC_WRITE */..   
1f010 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f020 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1f030 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1f040 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  g = pFile->eFile
1f050 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
1f060 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f070 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1f080 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45  ITE_FCNTL_LAST_E
1f090 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
1f0a0 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
1f0b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
1f0c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f0d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f0e0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f0f0 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
1f100 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
1f110 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
1f120 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
1f130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1f140 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f150 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1f160 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  NT: {.      int 
1f170 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  rc;.      Simula
1f180 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1f190 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  1);.      rc = f
1f1a0 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69  cntlSizeHint(pFi
1f1b0 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67  le, *(i64 *)pArg
1f1c0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1f1d0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1f1e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f1f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  rc;.    }.    ca
1f200 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f210 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
1f220 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1f230 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1f240 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69  _PERSIST_WAL, (i
1f250 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1f260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f270 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f280 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1f290 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1f2a0 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  TE: {.      unix
1f2b0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1f2c0 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  NIXFILE_PSOW, (i
1f2d0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1f2e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f2f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f300 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
1f310 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
1f320 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1f330 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f340 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
1f350 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
1f360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f370 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f380 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
1f390 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
1f3a0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
1f3b0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
1f3c0 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66  oc64( pFile->pVf
1f3d0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
1f3e0 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c  .      if( zTFil
1f3f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  e ){.        uni
1f400 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  xGetTempname(pFi
1f410 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1f420 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20  name, zTFile);. 
1f430 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
1f440 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
1f450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1f460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f470 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1f480 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
1f490 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28  OVED: {.      *(
1f4a0 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65  int*)pArg = file
1f4b0 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b  HasMoved(pFile);
1f4c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f4d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1f4e0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1f4f0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
1f500 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f510 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
1f520 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
1f530 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1f540 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
1f550 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1f560 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
1f570 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f580 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
1f590 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
1f5a0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f5b0 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
1f5c0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ..      /* The v
1f5d0 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74  alue of newLimit
1f5e0 20 6d 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c   may be eventual
1f5f0 6c 79 20 63 61 73 74 20 74 6f 20 28 73 69 7a 65  ly cast to (size
1f600 5f 74 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20  _t) and passed. 
1f610 20 20 20 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28       ** to mmap(
1f620 29 2e 20 52 65 73 74 72 69 63 74 20 69 74 73 20  ). Restrict its 
1f630 76 61 6c 75 65 20 74 6f 20 32 47 42 20 69 66 20  value to 2GB if 
1f640 28 73 69 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20  (size_t) is not 
1f650 61 74 20 6c 65 61 73 74 20 61 0a 20 20 20 20 20  at least a.     
1f660 20 2a 2a 20 36 34 2d 62 69 74 20 74 79 70 65 2e   ** 64-bit type.
1f670 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 65   */.      if( ne
1f680 77 4c 69 6d 69 74 3e 30 20 26 26 20 73 69 7a 65  wLimit>0 && size
1f690 6f 66 28 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a  of(size_t)<8 ){.
1f6a0 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74          newLimit
1f6b0 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20 26 20 30   = (newLimit & 0
1f6c0 78 37 46 46 46 46 46 46 46 29 3b 0a 20 20 20 20  x7FFFFFFF);.    
1f6d0 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28 69 36 34    }..      *(i64
1f6e0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1f6f0 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
1f700 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1f710 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
1f720 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1f730 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
1f740 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
1f750 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1f760 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
1f770 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  it;.        if( 
1f780 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e  pFile->mmapSize>
1f790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
1f7a0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
1f7b0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
1f7c0 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
1f7d0 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20  pFile, -1);.    
1f7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f7f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f800 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64     }.#endif.#ifd
1f810 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1f820 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1f830 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1f840 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1f850 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1f860 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1f870 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1f880 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1f890 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1f8a0 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1f8b0 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1f8c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1f8d0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1f8e0 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1f8f0 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1f900 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f910 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1f920 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1f930 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1f940 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1f950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f960 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1f970 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1f980 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1f990 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1f9a0 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1f9b0 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b  E_FCNTL_SET_LOCK
1f9c0 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63  PROXYFILE:.    c
1f9d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f9e0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
1f9f0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
1fa00 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
1fa10 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
1fa20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1fa30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1fa40 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1fa50 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1fa60 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  _) */.  }.  retu
1fa70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
1fa80 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ND;.}../*.** If 
1fa90 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  pFd->sectorSize 
1faa0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  is non-zero when
1fab0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1fac0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
1fad0 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  a.** no-op. Othe
1fae0 72 77 69 73 65 2c 20 74 68 65 20 76 61 6c 75 65  rwise, the value
1faf0 73 20 6f 66 20 70 46 64 2d 3e 73 65 63 74 6f 72  s of pFd->sector
1fb00 53 69 7a 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64  Size and .** pFd
1fb10 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1fb20 72 69 73 74 69 63 73 20 61 72 65 20 73 65 74 20  ristics are set 
1fb30 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1fb40 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
1fb50 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1fb60 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  . .**.** There a
1fb70 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
1fb80 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1fb90 2e 20 4f 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e  . One for QNX an
1fba0 64 20 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a  d one for all.**
1fbb0 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a   other systems..
1fbc0 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58  */.#ifndef __QNX
1fbd0 4e 54 4f 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69  NTO__.static voi
1fbe0 64 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61  d setDeviceChara
1fbf0 63 74 65 72 69 73 74 69 63 73 28 75 6e 69 78 46  cteristics(unixF
1fc00 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73  ile *pFd){.  ass
1fc10 65 72 74 28 20 70 46 64 2d 3e 64 65 76 69 63 65  ert( pFd->device
1fc20 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3d  Characteristics=
1fc30 3d 30 20 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f  =0 || pFd->secto
1fc40 72 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66  rSize!=0 );.  if
1fc50 28 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  ( pFd->sectorSiz
1fc60 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69  e==0 ){.#if defi
1fc70 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
1fc80 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1fc90 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
1fca0 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20  OMIC_WRITE).    
1fcb0 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 75 33 32  int res;.    u32
1fcc0 20 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20   f = 0;..    /* 
1fcd0 43 68 65 63 6b 20 66 6f 72 20 73 75 70 70 6f 72  Check for suppor
1fce0 74 20 66 6f 72 20 46 32 46 53 20 61 74 6f 6d 69  t for F2FS atomi
1fcf0 63 20 62 61 74 63 68 20 77 72 69 74 65 73 2e 20  c batch writes. 
1fd00 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 49  */.    res = osI
1fd10 6f 63 74 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46  octl(pFd->h, F2F
1fd20 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55 52  S_IOC_GET_FEATUR
1fd30 45 53 2c 20 26 66 29 3b 0a 20 20 20 20 69 66 28  ES, &f);.    if(
1fd40 20 72 65 73 3d 3d 30 20 26 26 20 28 66 20 26 20   res==0 && (f & 
1fd50 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f  F2FS_FEATURE_ATO
1fd60 4d 49 43 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  MIC_WRITE) ){.  
1fd70 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43      pFd->deviceC
1fd80 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1fd90 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
1fda0 54 43 48 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20  TCH_ATOMIC;.    
1fdb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69  }.#endif /* __li
1fdc0 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f  nux__ && SQLITE_
1fdd0 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f  ENABLE_BATCH_ATO
1fde0 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20  MIC_WRITE */..  
1fdf0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 50 4f 57    /* Set the POW
1fe00 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1fe10 20 66 6c 61 67 20 69 66 20 72 65 71 75 65 73 74   flag if request
1fe20 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
1fe30 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
1fe40 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b  UNIXFILE_PSOW ){
1fe50 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69  .      pFd->devi
1fe60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fe70 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  s |= SQLITE_IOCA
1fe80 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1fe90 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  WRITE;.    }..  
1fea0 20 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a    pFd->sectorSiz
1feb0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1fec0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1fed0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63    }.}.#else.#inc
1fee0 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62  lude <sys/dcmd_b
1fef0 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  lk.h>.#include <
1ff00 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73  sys/statvfs.h>.s
1ff10 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65  tatic void setDe
1ff20 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1ff30 69 63 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ics(unixFile *pF
1ff40 69 6c 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  ile){.  if( pFil
1ff50 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d  e->sectorSize ==
1ff60 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   0 ){.    struct
1ff70 20 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b   statvfs fsInfo;
1ff80 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20  .       .    /* 
1ff90 53 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72  Set defaults for
1ffa0 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66   non-supported f
1ffb0 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ilesystems */.  
1ffc0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1ffd0 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1ffe0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1fff0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76  ;.    pFile->dev
20000 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20010 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  cs = 0;.    if( 
20020 66 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e  fstatvfs(pFile->
20030 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
20040 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  1 ) {.      retu
20050 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  rn pFile->sector
20060 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Size;.    }..   
20070 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
20080 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
20090 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20  "tmp") ) {.     
200a0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
200b0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
200c0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
200d0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
200e0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
200f0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
20100 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20  TOMIC4K |       
20110 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73  /* All ram files
20120 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
20130 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
20140 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20150 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
20160 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
20170 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
20180 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
201c0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
201d0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
201e0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
201f0 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
20200 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
20210 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20240 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
20250 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
20260 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
20270 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
20280 61 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29  asetype, "etfs")
20290 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
202a0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
202b0 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
202c0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
202d0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
202e0 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74   =.        /* et
202f0 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20  fs cluster size 
20300 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
20310 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46  c */.        (pF
20320 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20330 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
20340 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
20350 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
20360 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
20370 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
20380 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
20390 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
203a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
203d0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
203e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
203f0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
20400 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
20410 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
20420 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20450 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
20460 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
20470 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
20480 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
20490 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
204a0 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20   "qnx6") ){.    
204b0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
204c0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
204d0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
204e0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
204f0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
20500 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20510 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20  ATOMIC |        
20520 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74   /* All filesyst
20530 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
20540 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
20550 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
20560 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
20570 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
20580 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
20590 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
205c0 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
205d0 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
205e0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
205f0 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
20600 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
20610 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
20620 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20640 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
20650 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
20660 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
20670 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72    }else if( !str
20680 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
20690 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29  etype, "qnx4") )
206a0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
206b0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
206c0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
206d0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
206e0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
206f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c  .        /* full
20700 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69   bitset of atomi
20710 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74  cs from max sect
20720 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c  or size and smal
20730 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ler */.        (
20740 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
20750 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
20760 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
20770 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20  2) << 1) - 2 |. 
20780 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20790 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
207a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
207b0 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
207c0 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
20800 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
20810 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
20820 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e   if( strstr(fsIn
20830 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
20840 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  dos") ){.      p
20850 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20860 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
20870 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
20880 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20890 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
208a0 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
208b0 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
208c0 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
208d0 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
208e0 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
208f0 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
20900 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
20910 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
20920 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
20930 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
20940 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
20950 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
20960 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
20970 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
209a0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
209b0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
209c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
209d0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
209e0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
209f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20a00 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20  AP_ATOMIC512 |  
20a10 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72      /* blocks ar
20a20 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
20a30 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
20a40 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
20a50 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
20a60 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
20a70 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
20ab0 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
20ac0 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    0;.    }.  }. 
20ad0 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20   /* Last chance 
20ae0 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49  verification.  I
20af0 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  f the sector siz
20b00 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70  e isn't a multip
20b10 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74  le of 512.  ** t
20b20 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c  hen it isn't val
20b30 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  id.*/.  if( pFil
20b40 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20  e->sectorSize % 
20b50 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20  512 != 0 ){.    
20b60 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
20b70 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30  racteristics = 0
20b80 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63  ;.    pFile->sec
20b90 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
20ba0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
20bb0 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  SIZE;.  }.}.#end
20bc0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
20bd0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
20be0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
20bf0 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
20c00 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
20c10 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
20c20 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
20c30 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
20c40 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
20c50 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
20c60 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
20c70 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
20c80 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
20c90 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
20ca0 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
20cb0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
20cc0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
20cd0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
20ce0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
20cf0 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
20d00 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
20d10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
20d20 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
20d30 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
20d40 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
20d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
20d60 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
20d70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
20d80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
20d90 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
20da0 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61  ;.  setDeviceCha
20db0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64  racteristics(pFd
20dc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d  );.  return pFd-
20dd0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a  >sectorSize;.}..
20de0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
20df0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
20e00 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
20e10 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
20e20 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74   VFS is set up t
20e30 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
20e40 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
20e50 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66  OVERWRITE by def
20e60 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ault..** However
20e70 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73  , that choice is
20e80 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73   controversial s
20e90 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79  ince technically
20ea0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
20eb0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64  ** file system d
20ec0 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70  oes not always p
20ed0 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65  rovide powersafe
20ee0 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49   overwrites.  (I
20ef0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
20f00 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d  , after a power-
20f10 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74  loss event, part
20f20 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  s of the file th
20f30 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a  at were never.**
20f40 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65   written might e
20f50 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65  nd up being alte
20f60 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20  red.)  However, 
20f70 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f  non-PSOW behavio
20f80 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65  r is very,.** ve
20f90 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73  ry rare.  And as
20fa0 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b  serting PSOW mak
20fb0 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63  es a large reduc
20fc0 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75  tion in the amou
20fd0 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65  nt.** of require
20fe0 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61  d I/O for journa
20ff0 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f  ling, since a lo
21000 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  t of padding is 
21010 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20  eliminated..**  
21020 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57  Hence, while POW
21030 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
21040 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
21050 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69  t, there is a fi
21060 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76  le-control.** av
21070 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
21080 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71  it off and URI q
21090 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61  uery parameter a
210a0 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
210b0 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74   it off..*/.stat
210c0 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63  ic int unixDevic
210d0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
210e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
210f0 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
21100 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  pFd = (unixFile*
21110 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65  )id;.  setDevice
21120 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
21130 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pFd);.  return p
21140 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  Fd->deviceCharac
21150 74 65 72 69 73 74 69 63 73 3b 0a 7d 0a 0a 23 69  teristics;.}..#i
21160 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
21170 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
21180 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
21190 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  IZE>0../*.** Ret
211a0 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70  urn the system p
211b0 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
211c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
211d0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
211e0 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f  ed directly by o
211f0 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69  ther code in thi
21200 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74  s file. .** Inst
21210 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62  ead, it should b
21220 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63  e called via mac
21230 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ro osGetpagesize
21240 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
21250 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a  t unixGetpagesiz
21260 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f  e(void){.#if OS_
21270 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
21280 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66   1024;.#elif def
21290 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45  ined(_BSD_SOURCE
212a0 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61  ).  return getpa
212b0 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a  gesize();.#else.
212c0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79    return (int)sy
212d0 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49  sconf(_SC_PAGESI
212e0 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  ZE);.#endif.}..#
212f0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
21300 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
21310 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
21320 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
21330 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21340 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
21350 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
21360 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
21370 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
21380 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
21390 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
213a0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
213b0 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
213c0 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
213d0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
213e0 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
213f0 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
21400 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
21410 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
21420 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
21430 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
21440 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
21450 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
21460 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
21470 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
21480 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
21490 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
214a0 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
214b0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
214c0 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
214d0 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
214e0 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
214f0 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
21500 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
21510 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
21520 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
21530 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
21540 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
21550 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
21560 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
21570 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
21580 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
21590 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
215a0 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
215b0 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
215c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
215d0 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
215e0 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
215f0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
21600 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
21610 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
21620 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
21630 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
21640 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
21650 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
21660 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
21670 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
21680 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
21690 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
216a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
216b0 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
216c0 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
216d0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
216e0 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
216f0 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
21700 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
21710 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
21720 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
21730 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
21740 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
21750 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
21760 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
21770 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
21780 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
21790 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
217a0 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
217b0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
217c0 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
217d0 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
217e0 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
217f0 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
21800 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
21810 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
21820 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
21830 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
21840 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
21850 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
21860 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
21870 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
21880 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
21890 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
218c0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
218d0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
218e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
218f0 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
21900 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
21910 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
21920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
21930 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
21940 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
21950 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
21960 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21970 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
21980 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20  u8 isUnlocked;  
21990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
219a0 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63  ue if no DMS loc
219b0 6b 20 68 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72  k held */.  char
219c0 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20   **apRegion;    
219d0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
219e0 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64  of mapped shared
219f0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
21a00 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
21a30 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
21a40 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
21a50 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
21a60 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
21a70 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
21a80 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
21a90 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20   this */.#ifdef 
21aa0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
21ab0 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  8 exclMask;     
21ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
21ad0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
21ae0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
21af0 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  8 sharedMask;   
21b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
21b10 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
21b20 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e  s held */.  u8 n
21b30 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
21b40 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
21b50 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d  vailable unixShm
21b60 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
21b70 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  dif.};../*.** St
21b80 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
21b90 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
21ba0 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
21bb0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
21bc0 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
21bd0 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
21be0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
21bf0 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
21c00 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
21c10 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
21c20 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
21c30 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
21c40 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
21c50 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a   unixShm.pFile.*
21c60 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a  *    unixShm.id.
21c70 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
21c80 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
21c90 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78  write.  The unix
21ca0 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78  Shm.pFile->mutex
21cb0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
21cc0 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
21cd0 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
21ce0 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
21cf0 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e  t unixShm {.  un
21d00 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
21d10 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ode;     /* The 
21d20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53  underlying unixS
21d30 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
21d40 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78  .  unixShm *pNex
21d50 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
21d60 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69   Next unixShm wi
21d70 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78  th the same unix
21d80 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
21d90 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
21da0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21db0 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
21dc0 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  nixShmNode mutex
21dd0 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
21e00 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
21e10 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
21e20 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
21e30 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
21e40 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
21e50 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
21e60 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e80 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
21e90 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
21ea0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
21eb0 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
21ec0 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
21ed0 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
21ee0 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
21ef0 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
21f00 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
21f10 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
21f20 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
21f30 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
21f40 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
21f50 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
21f60 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
21f70 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
21f80 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
21f90 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
21fa0 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
21fb0 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
21fc0 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
21fd0 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
21fe0 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
21ff0 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
22000 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
22010 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
22020 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
22030 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
22040 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
22050 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57  nection to the W
22060 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  AL file */.  int
22070 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
22080 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
22090 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
220a0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
220b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
220c0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
220d0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
220e0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22110 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
22120 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
22130 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c  ShmNode; /* Appl
22140 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
22150 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
22160 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
22170 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
22180 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
22190 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
221a0 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
221b0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
221c0 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
221d0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
221e0 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
221f0 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
22200 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
22210 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
22220 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
22230 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69    pShmNode = pFi
22240 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
22250 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
22260 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
22270 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
22280 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
22290 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
222a0 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
222b0 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
222c0 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
222d0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
222e0 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
222f0 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
22300 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
22310 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
22320 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49   n>=1 && n<=SQLI
22330 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
22340 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
22350 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
22360 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
22370 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
22380 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
22390 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
223a0 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
223b0 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
223c0 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
223d0 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
223e0 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
223f0 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
22400 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
22410 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
22420 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
22430 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
22440 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
22450 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
22460 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
22470 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
22480 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
22490 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
224a0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
224b0 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
224c0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
224d0 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66  "));.  mask = of
224e0 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a  st>31 ? 0xffff :
224f0 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
22500 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
22510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22520 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
22530 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
22540 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22550 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
22560 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
22570 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
22580 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
22590 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
225a0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
225b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
225c0 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
225d0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
225e0 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
225f0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
22600 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
22610 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
22620 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
22630 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
22640 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
22650 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
22660 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
22670 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22680 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
22690 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
226a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
226b0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
226c0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
226d0 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
226e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
226f0 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
22700 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
22710 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
22720 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
22730 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
22740 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
22750 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
22760 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
22770 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
22780 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22790 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
227a0 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
227b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
227c0 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
227d0 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
227e0 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
227f0 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
22800 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
22810 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
22820 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
22830 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
22840 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
22850 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
22860 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a          .}../*.*
22870 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e  * Return the min
22880 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33  imum number of 3
22890 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20  2KB shm regions 
228a0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d  that should be m
228b0 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69  apped at.** a ti
228c0 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  me, assuming tha
228d0 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d  t each mapping m
228e0 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65  ust be an intege
228f0 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
22900 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73  e.** current sys
22910 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a  tem page-size..*
22920 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
22930 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78 63  is is 1. The exc
22940 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20  eption seems to 
22950 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  be systems that 
22960 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  are configured.*
22970 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61  * to use 64KB pa
22980 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61  ges - in this ca
22990 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  se each mapping 
229a0 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65  must cover at le
229b0 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72  ast two.** shm r
229c0 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  egions..*/.stati
229d0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67  c int unixShmReg
229e0 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b  ionPerMap(void){
229f0 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33  .  int shmsz = 3
22a00 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20 20  2*1024;         
22a10 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e     /* SHM region
22a20 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70   size */.  int p
22a30 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73  gsz = osGetpages
22a40 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74  ize();   /* Syst
22a50 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  em page size */.
22a60 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73 7a    assert( ((pgsz
22a70 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20  -1)&pgsz)==0 ); 
22a80 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d    /* Page size m
22a90 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
22aa0 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73  f 2 */.  if( pgs
22ab0 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e  z<shmsz ) return
22ac0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73   1;.  return pgs
22ad0 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  z/shmsz;.}../*.*
22ae0 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
22af0 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
22b00 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
22b10 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
22b20 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
22b30 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
22b40 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
22b50 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
22b60 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
22b70 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
22b80 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
22b90 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
22ba0 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
22bb0 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
22bc0 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
22bd0 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
22be0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
22bf0 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
22c00 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
22c10 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d  ( p && ALWAYS(p-
22c20 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20 20  >nRef==0) ){.   
22c30 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20   int nShmPerMap 
22c40 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  = unixShmRegionP
22c50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74  erMap();.    int
22c60 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
22c70 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
22c80 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71  pInode );.    sq
22c90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
22ca0 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
22cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
22cc0 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65  egion; i+=nShmPe
22cd0 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28  rMap){.      if(
22ce0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
22cf0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
22d00 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
22d10 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
22d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22d30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
22d40 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
22d50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22d60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
22d70 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
22d80 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
22d90 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
22da0 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
22db0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
22dc0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
22dd0 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
22de0 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
22df0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
22e00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
22e10 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20 6e 6f   DMS lock has no
22e20 74 20 79 65 74 20 62 65 65 6e 20 74 61 6b 65 6e  t yet been taken
22e30 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70 53 68   on shm file pSh
22e40 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74 20 74  mNode. Attempt t
22e50 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e 6f 77  o.** take it now
22e60 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
22e70 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
22e80 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
22e90 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
22ea0 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erwise..**.** If
22eb0 20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f 74 20   the DMS cannot 
22ec0 62 65 20 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  be locked becaus
22ed0 65 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  e this is a read
22ee0 6f 6e 6c 79 5f 73 68 6d 3d 31 20 0a 2a 2a 20 63  only_shm=1 .** c
22ef0 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 6e 6f  onnection and no
22f00 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
22f10 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 20 6c  lready holds a l
22f20 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ock, return.** S
22f30 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
22f40 41 4e 54 49 4e 49 54 20 61 6e 64 20 73 65 74 20  ANTINIT and set 
22f50 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
22f60 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  cked=1..*/.stati
22f70 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53 68  c int unixLockSh
22f80 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
22f90 69 6c 65 20 2a 70 44 62 46 64 2c 20 75 6e 69 78  ile *pDbFd, unix
22fa0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
22fb0 65 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  e){.  struct flo
22fc0 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
22fd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22fe0 20 20 2f 2a 20 55 73 65 20 46 5f 47 45 54 4c 4b    /* Use F_GETLK
22ff0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
23000 65 20 6c 6f 63 6b 73 20 6f 74 68 65 72 20 70 72  e locks other pr
23010 6f 63 65 73 73 65 73 20 61 72 65 20 68 6f 6c 64  ocesses are hold
23020 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ing.  ** on the 
23030 44 4d 53 20 62 79 74 65 2e 20 49 66 20 69 74 20  DMS byte. If it 
23040 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 61  indicates that a
23050 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
23060 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 61  s holding.  ** a
23070 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
23080 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  en this process 
23090 6d 61 79 20 61 6c 73 6f 20 74 61 6b 65 20 61 20  may also take a 
230a0 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
230b0 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74   and proceed wit
230c0 68 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d  h opening the *-
230d0 73 68 6d 20 66 69 6c 65 2e 20 0a 20 20 2a 2a 0a  shm file. .  **.
230e0 20 20 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f 20 6f    ** Or, if no o
230f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
23100 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c 6f 63 6b  holding any lock
23110 2c 20 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63  , then this proc
23120 65 73 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  ess.  ** is the 
23130 66 69 72 73 74 20 74 6f 20 6f 70 65 6e 20 69 74  first to open it
23140 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
23150 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ake an EXCLUSIVE
23160 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
23170 2a 20 44 4d 53 20 62 79 74 65 20 61 6e 64 20 74  * DMS byte and t
23180 72 75 6e 63 61 74 65 20 74 68 65 20 2a 2d 73 68  runcate the *-sh
23190 6d 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  m file to zero b
231a0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
231b0 65 6e 0a 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64  en.  ** downgrad
231c0 65 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  e to a SHARED lo
231d0 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79  ck on the DMS by
231e0 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  te..  **.  ** If
231f0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
23200 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45   is holding an E
23210 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
23220 20 74 68 65 20 44 4d 53 20 62 79 74 65 2c 0a 20   the DMS byte,. 
23230 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
23240 45 5f 42 55 53 59 20 74 6f 20 74 68 65 20 63 61  E_BUSY to the ca
23250 6c 6c 65 72 20 28 69 74 20 77 69 6c 6c 20 74 72  ller (it will tr
23260 79 20 61 67 61 69 6e 29 2e 20 41 6e 20 65 61 72  y again). An ear
23270 6c 69 65 72 0a 20 20 2a 2a 20 76 65 72 73 69 6f  lier.  ** versio
23280 6e 20 6f 66 20 74 68 69 73 20 63 6f 64 65 20 61  n of this code a
23290 74 74 65 6d 70 74 65 64 20 74 68 65 20 53 48 41  ttempted the SHA
232a0 52 45 44 20 6c 6f 63 6b 20 61 74 20 74 68 69 73  RED lock at this
232b0 20 70 6f 69 6e 74 2e 20 42 75 74 0a 20 20 2a 2a   point. But.  **
232c0 20 74 68 69 73 20 69 6e 74 72 6f 64 75 63 65 64   this introduced
232d0 20 61 20 73 75 62 74 6c 65 20 72 61 63 65 20 63   a subtle race c
232e0 6f 6e 64 69 74 69 6f 6e 3a 20 69 66 20 74 68 65  ondition: if the
232f0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 69 6e 67   process holding
23300 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20  .  ** EXCLUSIVE 
23310 66 61 69 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  failed just befo
23320 72 65 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  re truncating th
23330 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2c 20 74 68  e *-shm file, th
23340 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70 72 6f  en this.  ** pro
23350 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
23360 61 6e 64 20 75 73 65 20 74 68 65 20 2a 2d 73 68  and use the *-sh
23370 6d 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 74  m file without t
23380 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 20 20  runcating it..  
23390 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 2a 2d  ** And if the *-
233a0 73 68 6d 20 66 69 6c 65 20 68 61 73 20 62 65 65  shm file has bee
233b0 6e 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 61  n corrupted by a
233c0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
233d0 72 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72  r.  ** system cr
233e0 61 73 68 2c 20 74 68 65 20 64 61 74 61 62 61 73  ash, the databas
233f0 65 20 69 74 73 65 6c 66 20 6d 61 79 20 61 6c 73  e itself may als
23400 6f 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  o become corrupt
23410 2e 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 77  .  */.  lock.l_w
23420 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
23430 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74  ;.  lock.l_start
23440 20 3d 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 3b   = UNIX_SHM_DMS;
23450 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
23460 31 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  1;.  lock.l_type
23470 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 69 66   = F_WRLCK;.  if
23480 28 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  ( osFcntl(pShmNo
23490 64 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  de->h, F_GETLK, 
234a0 26 6c 6f 63 6b 29 21 3d 30 20 29 20 7b 0a 20 20  &lock)!=0 ) {.  
234b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
234c0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  ERR_LOCK;.  }els
234d0 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
234e0 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
234f0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
23500 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
23510 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
23520 55 6e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20  Unlocked = 1;.  
23530 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23540 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49  READONLY_CANTINI
23550 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
23560 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
23570 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
23580 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
23590 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
235a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
235b0 45 5f 4f 4b 20 26 26 20 72 6f 62 75 73 74 5f 66  E_OK && robust_f
235c0 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64  truncate(pShmNod
235d0 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20  e->h, 0) ){.    
235e0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
235f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23600 52 52 5f 53 48 4d 4f 50 45 4e 2c 22 66 74 72 75  RR_SHMOPEN,"ftru
23610 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f 64 65 2d  ncate",pShmNode-
23620 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
23630 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
23640 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
23650 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
23660 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
23670 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  USY;.  }..  if( 
23680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23690 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63  .    assert( loc
236a0 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  k.l_type==F_UNLC
236b0 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  K || lock.l_type
236c0 3d 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 20 20 20  ==F_RDLCK );.   
236d0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
236e0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
236f0 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _RDLCK, UNIX_SHM
23700 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  _DMS, 1);.  }.  
23710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23720 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
23730 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
23740 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
23750 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
23760 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
23770 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
23780 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
23790 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
237a0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
237b0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
237c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
237d0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
237e0 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
237f0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
23800 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
23810 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
23820 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
23830 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
23840 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
23850 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
23860 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
23870 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
23880 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
23890 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
238a0 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
238b0 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
238c0 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
238d0 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
238e0 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
238f0 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
23900 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
23910 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
23920 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
23930 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
23940 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
23950 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
23960 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
23970 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
23980 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
23990 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
239a0 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
239b0 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
239c0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
239d0 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
239e0 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
239f0 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
23a00 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
23a10 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
23a20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
23a30 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
23a40 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
23a50 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
23a60 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
23a70 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
23a80 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
23a90 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
23aa0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
23ab0 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
23ac0 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
23ad0 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
23ae0 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
23af0 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
23b00 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
23b10 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
23b20 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
23b30 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
23b40 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
23b50 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
23b60 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
23b70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
23b80 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
23b90 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
23ba0 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
23bb0 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
23bc0 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
23bd0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
23be0 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
23bf0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
23c00 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
23c10 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
23c20 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
23c30 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
23c40 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
23c50 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
23c60 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
23c70 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
23c80 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
23c90 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
23ca0 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
23cb0 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
23cc0 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
23cd0 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
23ce0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
23cf0 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
23d00 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
23d10 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
23d20 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
23d30 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
23d40 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
23d50 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
23d60 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
23d70 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
23d80 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
23d90 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
23da0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
23db0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
23dc0 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
23dd0 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
23de0 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
23df0 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
23e00 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
23e10 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
23e20 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
23e30 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
23e40 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
23e50 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
23e60 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
23e70 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
23e80 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
23e90 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
23ea0 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
23eb0 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
23ec0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
23ed0 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
23ee0 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
23ef0 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
23f00 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
23f10 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
23f20 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
23f30 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
23f40 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
23f50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
23f60 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
23f70 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
23f80 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
23f90 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
23fa0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
23fb0 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
23fc0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
23fd0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
23fe0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
23ff0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
24000 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
24010 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
24020 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
24030 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 3b 20 20  .  char *zShm;  
24040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
24050 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75  me of the file u
24060 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20  sed for SHM */. 
24070 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d   int nShmFilenam
24080 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
24090 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
240a0 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  SHM filename in 
240b0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41  bytes */..  /* A
240c0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
240d0 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68  r the new unixSh
240e0 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70  m object. */.  p
240f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
24100 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  c64( sizeof(*p) 
24110 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
24120 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
24130 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 73  MEM_BKPT;.  mems
24140 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
24150 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *p));.  assert( 
24160 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
24170 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
24180 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68   see if a unixSh
24190 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72  mNode object alr
241a0 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75  eady exists. Reu
241b0 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  se an existing. 
241c0 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65   ** one if prese
241d0 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77  nt. Create a new
241e0 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
241f0 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  y..  */.  unixEn
24200 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
24210 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
24220 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  node;.  pShmNode
24230 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e   = pInode->pShmN
24240 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  ode;.  if( pShmN
24250 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ode==0 ){.    st
24260 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24280 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f   /* fstat() info
24290 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
242a0 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le */.#ifndef SQ
242b0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
242c0 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  RY.    const cha
242d0 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d 20 70  r *zBasePath = p
242e0 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e  DbFd->zPath;.#en
242f0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  dif..    /* Call
24300 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75   fstat() to figu
24310 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69  re out the permi
24320 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61  ssions on the da
24330 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
24340 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73      ** a new *-s
24350 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  hm file is creat
24360 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77  ed, an attempt w
24370 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63  ill be made to c
24380 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  reate it.    ** 
24390 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65  with the same pe
243a0 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a  rmissions..    *
243b0 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
243c0 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74  t(pDbFd->h, &sSt
243d0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  at) ){.      rc 
243e0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
243f0 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  STAT;.      goto
24400 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
24410 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
24420 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
24430 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  Y.    nShmFilena
24440 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49  me = sizeof(SQLI
24450 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
24460 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20  ) + 31;.#else.  
24470 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    nShmFilename =
24480 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e   6 + (int)strlen
24490 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e  (zBasePath);.#en
244a0 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
244b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
244c0 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  c64( sizeof(*pSh
244d0 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c  mNode) + nShmFil
244e0 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28  ename );.    if(
244f0 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
24500 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24510 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
24520 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
24530 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
24540 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
24550 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
24560 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e  mNode)+nShmFilen
24570 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 20 3d  ame);.    zShm =
24580 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
24590 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
245a0 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
245b0 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
245c0 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
245d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
245e0 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c  mFilename, zShm,
245f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
24600 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48         SQLITE_SH
24610 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71  M_DIRECTORY "/sq
24620 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c  lite-shm-%x-%x",
24630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24640 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74        (u32)sStat
24650 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53  .st_ino, (u32)sS
24660 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c  tat.st_dev);.#el
24670 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  se.    sqlite3_s
24680 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
24690 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 22 25 73 2d  name, zShm, "%s-
246a0 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29  shm", zBasePath)
246b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
246c0 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
246d0 7a 50 61 74 68 2c 20 7a 53 68 6d 29 3b 0a 23 65  zPath, zShm);.#e
246e0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
246f0 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70  e->h = -1;.    p
24700 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
24710 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
24720 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
24730 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d  >pInode = pDbFd-
24740 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66 28  >pInode;.    if(
24750 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
24760 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
24770 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  ){.      pShmNod
24780 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
24790 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
247a0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
247b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
247c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
247d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
247e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
247f0 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
24800 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
24810 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
24820 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
24830 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
24840 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
24850 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
24860 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22  (pDbFd->zPath, "
24870 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30  readonly_shm", 0
24880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  ) ){.        pSh
24890 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
248a0 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52  t_open(zShm, O_R
248b0 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 28 73 53  DWR|O_CREAT, (sS
248c0 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  tat.st_mode&0777
248d0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
248e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
248f0 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  h<0 ){.        p
24900 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
24910 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f  ust_open(zShm, O
24920 5f 52 44 4f 4e 4c 59 2c 20 28 73 53 74 61 74 2e  _RDONLY, (sStat.
24930 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
24940 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d          if( pShm
24950 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20  Node->h<0 ){.   
24960 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
24970 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24980 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
24990 6f 70 65 6e 22 2c 20 7a 53 68 6d 29 3b 0a 20 20  open", zShm);.  
249a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
249b0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
249c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 53 68     }.        pSh
249d0 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
249e0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  y = 1;.      }..
249f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
24a00 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e   process is runn
24a10 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b  ing as root, mak
24a20 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
24a30 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  SHM file.      *
24a40 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68  * is owned by th
24a50 65 20 73 61 6d 65 20 75 73 65 72 20 74 68 61 74  e same user that
24a60 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e   owns the origin
24a70 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74  al database.  Ot
24a80 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
24a90 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  * the original o
24aa0 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65  wner will not be
24ab0 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74   able to connect
24ac0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
24ad0 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 70 53   robustFchown(pS
24ae0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74  hmNode->h, sStat
24af0 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73  .st_uid, sStat.s
24b00 74 5f 67 69 64 29 3b 0a 0a 20 20 20 20 20 20 72  t_gid);..      r
24b10 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72  c = unixLockShar
24b20 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20  edMemory(pDbFd, 
24b30 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 20  pShmNode);.     
24b40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24b50 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
24b60 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e  _READONLY_CANTIN
24b70 49 54 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  IT ) goto shm_op
24b80 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
24b90 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
24ba0 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
24bb0 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
24bc0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
24bd0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
24be0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
24bf0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
24c00 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
24c10 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
24c20 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
24c30 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
24c40 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
24c50 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
24c60 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
24c70 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
24c80 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
24c90 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
24ca0 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
24cb0 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
24cc0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
24cd0 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
24ce0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
24cf0 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
24d00 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
24d10 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
24d20 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
24d30 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
24d40 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
24d50 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
24d60 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
24d70 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
24d80 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
24d90 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
24da0 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
24db0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
24dc0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
24dd0 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
24de0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
24df0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
24e00 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
24e10 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
24e20 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
24e30 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
24e40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
24e50 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
24e60 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
24e70 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20   rc;..  /* Jump 
24e80 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
24e90 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
24ea0 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67  r:.  unixShmPurg
24eb0 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20  e(pDbFd);       
24ec0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
24ed0 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
24ee0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
24ef0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
24f00 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
24f10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24f20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
24f30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
24f40 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
24f50 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
24f60 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
24f70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
24f80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
24f90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24fa0 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
24fb0 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
24fc0 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
24fd0 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
24fe0 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
24ff0 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
25000 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
25010 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
25020 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
25030 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
25040 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
25050 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
25060 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
25070 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78  wise, if the bEx
25080 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  tend parameter i
25090 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
250a0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
250b0 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
250c0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
250d0 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
250e0 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
250f0 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
25100 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
25110 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
25120 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
25130 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
25140 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78  rned. If .** bEx
25150 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  tend is non-zero
25160 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
25170 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
25180 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
25190 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
251a0 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
251b0 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
251c0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
251d0 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
251e0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
251f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
25200 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
25210 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
25220 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
25230 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
25240 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
25250 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
25260 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
25270 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
25280 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
25290 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
252a0 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
252b0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
252c0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
252d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
252e0 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  ixShmMap(.  sqli
252f0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
25300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
25310 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
25320 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
25330 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
25360 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
25370 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
25380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25390 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
253a0 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c  /.  int bExtend,
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
253d0 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
253e0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
253f0 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25410 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
25420 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ry */.){.  unixF
25430 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
25440 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
25450 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78  ixShm *p;.  unix
25460 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
25470 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
25480 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
25490 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
254a0 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
254b0 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67  );.  int nReqReg
254c0 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ion;..  /* If th
254d0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
254e0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
254f0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
25500 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
25510 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
25520 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
25530 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
25540 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
25550 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25560 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
25570 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
25580 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
25590 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
255a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
255b0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
255c0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70  >mutex);.  if( p
255d0 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63  ShmNode->isUnloc
255e0 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ked ){.    rc = 
255f0 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65  unixLockSharedMe
25600 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53 68 6d  mory(pDbFd, pShm
25610 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Node);.    if( r
25620 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
25630 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
25640 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69  .    pShmNode->i
25650 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20  sUnlocked = 0;. 
25660 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52   }.  assert( szR
25670 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
25680 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
25690 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
256a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
256b0 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
256c0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
256d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
256e0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
256f0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
25700 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
25710 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
25720 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
25730 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
25740 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
25750 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65  /* Minimum numbe
25760 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72 65 71  r of regions req
25770 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61 70 70  uired to be mapp
25780 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67  ed. */.  nReqReg
25790 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b  ion = ((iRegion+
257a0 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53  nShmPerMap) / nS
257b0 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d  hmPerMap) * nShm
257c0 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70  PerMap;..  if( p
257d0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
257e0 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20  <nReqRegion ){. 
257f0 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b     char **apNew;
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52        /* New apR
25820 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
25830 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
25840 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65   nReqRegion*szRe
25850 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  gion;   /* Minim
25860 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
25870 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
25880 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74  /* Used by fstat
258b0 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  () */..    pShmN
258c0 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
258d0 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69  szRegion;..    i
258e0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
258f0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
25900 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
25910 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
25920 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
25930 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
25940 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65  ce..      ** Che
25950 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
25960 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
25970 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
25980 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
25990 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65  s.      ** large
259a0 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
259b0 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
259c0 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20   region)..      
259d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  */.      if( osF
259e0 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  stat(pShmNode->h
259f0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
25a00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25a10 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a  _IOERR_SHMSIZE;.
25a20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
25a30 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
25a40 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73  }.  .      if( s
25a50 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79  Stat.st_size<nBy
25a60 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  te ){.        /*
25a70 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
25a80 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
25a90 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
25aa0 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74  bExtend is set t
25ab0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c  o.        ** fal
25ac0 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20  se, exit early. 
25ad0 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20  *pp will be set 
25ae0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
25af0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
25b00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25b10 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20     if( !bExtend 
25b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
25b30 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
25b40 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
25b50 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
25b60 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69  ly, if bExtend i
25b70 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74  s true, extend t
25b80 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73  he file. Do this
25b90 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   by.        ** w
25ba0 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
25bb0 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20  byte to the end 
25bc0 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70 61 67  of each (OS) pag
25bd0 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  e being.        
25be0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  ** allocated or 
25bf0 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69  extended. Techni
25c00 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f  cally, we need o
25c10 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68 65  nly write to the
25c20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74  .        ** last
25c30 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74   page in order t
25c40 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c  o extend the fil
25c50 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20 74  e. But writing t
25c60 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20  o all new.      
25c70 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65    ** pages force
25c80 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f  s the OS to allo
25c90 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69  cate them immedi
25ca0 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64  ately, which red
25cb0 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  uces.        ** 
25cc0 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53  the chances of S
25cd0 49 47 42 55 53 20 77 68 69 6c 65 20 61 63 63 65  IGBUS while acce
25ce0 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64  ssing the mapped
25cf0 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e   region later on
25d00 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25d10 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20       else{.     
25d20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
25d30 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39  t int pgsz = 409
25d40 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  6;.          int
25d50 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20   iPg;..         
25d60 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
25d70 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61   last byte of ea
25d80 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  ch newly allocat
25d90 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70  ed or extended p
25da0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  age */.         
25db0 20 61 73 73 65 72 74 28 20 28 6e 42 79 74 65 20   assert( (nByte 
25dc0 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20  % pgsz)==0 );.  
25dd0 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
25de0 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70  (sStat.st_size/p
25df0 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65  gsz); iPg<(nByte
25e00 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a  /pgsz); iPg++){.
25e10 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
25e20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  x = 0;.         
25e30 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72     if( seekAndWr
25e40 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  iteFd(pShmNode->
25e50 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67  h, iPg*pgsz + pg
25e60 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26 78 29  sz-1, "", 1, &x)
25e70 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=1 ){.         
25e80 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25e90 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64  *zFile = pShmNod
25ea0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  e->zFilename;.  
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
25ec0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
25ed0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
25ee0 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69  ZE, "write", zFi
25ef0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  le);.           
25f00 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
25f10 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  out;.           
25f20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
25f30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25f40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
25f50 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
25f60 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
25f70 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
25f80 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
25f90 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
25fa0 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
25fb0 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
25fc0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
25fd0 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f  egion, nReqRegio
25fe0 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  n*sizeof(char *)
25ff0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
26000 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
26010 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
26020 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
26030 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
26040 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
26050 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
26060 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  on = apNew;.    
26070 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
26080 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
26090 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ion ){.      int
260a0 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e   nMap = szRegion
260b0 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20  *nShmPerMap;.   
260c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
260d0 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20  void *pMem;.    
260e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
260f0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
26100 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pMem = osMmap(0,
26110 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20   nMap,.         
26120 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52     pShmNode->isR
26130 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52  eadonly ? PROT_R
26140 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c  EAD : PROT_READ|
26150 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20  PROT_WRITE, .   
26160 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41           MAP_SHA
26170 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  RED, pShmNode->h
26180 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29  , szRegion*(i64)
26190 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
261a0 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
261b0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d       if( pMem==M
261c0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
261d0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
261e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
261f0 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d  IOERR_SHMMAP, "m
26200 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  map", pShmNode->
26210 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
26220 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
26230 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
26240 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
26250 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71         pMem = sq
26260 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
26270 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
26280 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b    if( pMem==0 ){
26290 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
262a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
262b0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
262c0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
262d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
262e0 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c   memset(pMem, 0,
262f0 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20   szRegion);.    
26300 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
26310 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70  =0; i<nShmPerMap
26320 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
26330 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
26340 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
26350 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61  gion+i] = &((cha
26360 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f  r*)pMem)[szRegio
26370 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n*i];.      }.  
26380 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
26390 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72  egion += nShmPer
263a0 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Map;.    }.  }..
263b0 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
263c0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
263d0 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
263e0 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f      *pp = pShmNo
263f0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65  de->apRegion[iRe
26400 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
26410 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
26420 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
26430 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72  >isReadonly && r
26440 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
26450 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
26460 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NLY;.  sqlite3_m
26470 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
26480 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
26490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
264a0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
264b0 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
264c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
264d0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ment..**.** Note
264e0 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69   that the relati
264f0 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53  onship between S
26500 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53  HAREd and EXCLUS
26510 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c  IVE locks is a l
26520 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65  ittle.** differe
26530 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20  nt here than in 
26540 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c  posix.  In xShmL
26550 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67  ock(), one can g
26560 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a  o from unlocked.
26570 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64  ** to shared and
26580 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e   back or from un
26590 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73  locked to exclus
265a0 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42  ive and back.  B
265b0 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f  ut one may.** no
265c0 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64  t go from shared
265d0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72   to exclusive or
265e0 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20   from exclusive 
265f0 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74  to shared..*/.st
26600 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
26610 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
26620 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
26630 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
26640 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
26650 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
26660 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26680 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
26690 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
266a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
266d0 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
266e0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
266f0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
26700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
26710 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
26720 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  e lock */.){.  u
26730 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
26740 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20   (unixFile*)fd; 
26750 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
26760 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
26770 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e  d memory */.  un
26780 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
26790 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
267a0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
267b0 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
267c0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ocked */.  unixS
267d0 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
26800 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
26810 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  s */.  unixShmNo
26820 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
26830 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20  ->pShmNode;  /* 
26840 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  The underlying f
26850 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69  ile iNode */.  i
26860 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26870 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
26880 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
26890 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
268a0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
268c0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
268d0 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
268e0 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
268f0 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
26900 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
26910 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
26920 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
26930 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
26940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  );.  assert( ofs
26950 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
26960 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
26970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
26980 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
26990 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
269a0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
269b0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
269c0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
269d0 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
269e0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
269f0 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
26a00 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
26a10 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
26a20 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
26a30 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
26a40 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
26a50 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
26a60 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
26a70 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
26a80 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
26a90 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
26aa0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26ab0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
26ac0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
26ad0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
26ae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
26af0 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
26b00 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
26b10 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
26b20 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ..  mask = (1<<(
26b30 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
26b40 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fst);.  assert( 
26b50 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
26b60 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
26b70 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
26b80 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
26b90 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
26ba0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
26bb0 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
26bc0 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
26bd0 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
26be0 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
26bf0 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
26c00 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
26c10 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
26c20 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
26c30 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
26c40 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
26c50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
26c60 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
26c70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
26c80 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
26c90 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
26ca0 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
26cb0 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
26cc0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
26cd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
26ce0 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
26cf0 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
26d00 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
26d10 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
26d20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
26d30 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
26d40 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
26d50 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
26d60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26d70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26d80 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
26d90 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
26da0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
26db0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26dc0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
26dd0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
26de0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
26df0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
26e00 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
26e10 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
26e20 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
26e30 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
26e40 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
26e50 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
26e60 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
26e70 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
26e80 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
26e90 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
26ea0 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
26eb0 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
26ec0 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
26ed0 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
26ee0 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
26ef0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
26f00 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
26f10 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
26f20 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
26f30 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
26f40 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
26f50 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
26f60 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
26f70 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
26f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
26f90 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
26fa0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
26fc0 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
26fd0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
26fe0 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
26ff0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
27000 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
27010 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
27020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
27040 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
27050 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
27060 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
27070 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
27080 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_RDLCK, ofst+UN
27090 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
270a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
270b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
270c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
270d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
270e0 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
270f0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
27100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27110 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
27120 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
27130 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
27140 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
27150 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
27160 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
27170 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
27180 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
27190 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
271a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
271b0 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
271c0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
271d0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
271e0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
271f0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
27200 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
27210 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
27220 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
27230 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
27240 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
27250 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
27260 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
27270 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
27280 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
27290 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
272a0 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
272b0 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
272c0 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
272d0 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
272e0 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
272f0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
27300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27310 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
27320 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
27330 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20  pDbFd, F_WRLCK, 
27340 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
27350 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
27360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27370 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
27380 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
27390 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
273a0 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
273b0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
273c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
273d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
273e0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
273f0 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
27400 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
27410 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
27420 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
27430 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
27440 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d   osGetpid(0), p-
27450 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
27460 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
27470 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27480 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
27490 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
274a0 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
274b0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
274c0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
274d0 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
274e0 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
274f0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
27500 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
27510 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
27520 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
27530 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
27540 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
27550 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
27560 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
27570 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
27580 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
27590 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
275a0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
275b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
275c0 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72  ;.  sqlite3Memor
275d0 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20  yBarrier();     
275e0 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d      /* compiler-
275f0 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62  defined memory b
27600 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78  arrier */.  unix
27610 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20  EnterMutex();   
27620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27630 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72  lso mutex, for r
27640 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75  edundancy */.  u
27650 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
27660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
27670 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
27680 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
27690 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
276a0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
276b0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
276c0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
276d0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
276e0 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
276f0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
27700 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
27710 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
27720 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
27730 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
27740 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
27750 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
27760 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
27770 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
27780 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
27790 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
277a0 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
277b0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
277c0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
277d0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
277e0 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
27810 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
27820 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
27830 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
27840 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
27850 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
27860 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
27870 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27890 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
278a0 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
278b0 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
278c0 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
278d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
278e0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
278f0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
27900 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
27910 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
27920 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
27930 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
27940 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
27950 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
27960 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
27970 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
27980 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
27990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
279a0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
279b0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
279c0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
279d0 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
279e0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
279f0 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
27a00 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
27a10 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
27a20 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
27a30 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
27a40 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
27a50 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
27a60 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
27a70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
27a80 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
27a90 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
27aa0 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
27ab0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
27ac0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
27ad0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
27ae0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
27af0 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
27b00 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
27b10 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
27b20 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
27b30 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
27b40 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
27b50 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
27b60 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
27b70 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
27b80 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
27b90 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
27ba0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
27bb0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
27bc0 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
27bd0 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
27be0 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  0 ){.      osUnl
27bf0 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  ink(pShmNode->zF
27c00 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
27c10 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
27c20 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
27c30 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
27c40 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
27c50 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
27c60 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
27c70 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
27c80 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
27c90 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
27ca0 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
27cb0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
27cc0 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
27cd0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
27ce0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69  _OMIT_WAL */..#i
27cf0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
27d00 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49  P_SIZE>0./*.** I
27d10 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
27d20 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c  y memory mapped,
27d30 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e   unmap file pFd.
27d40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d50 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
27d60 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
27d70 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
27d80 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69  tchOut==0 );.  i
27d90 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
27da0 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d  on ){.    osMunm
27db0 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  ap(pFd->pMapRegi
27dc0 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  on, pFd->mmapSiz
27dd0 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46  eActual);.    pF
27de0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
27df0 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
27e00 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
27e10 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
27e20 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  l = 0;.  }.}../*
27e30 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
27e40 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
27e50 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
27e60 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  g maintained by 
27e70 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70  file .** descrip
27e80 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20  tor pFd to nNew 
27e90 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74  bytes. Any exist
27ea0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64  ing mapping is d
27eb0 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  iscarded..**.** 
27ec0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
27ed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
27ee0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
27ef0 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
27f00 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
27f10 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20  pMapRegion.**   
27f20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
27f30 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75  pSize.**       u
27f40 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
27f50 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20  Actual.**.** If 
27f60 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  unsuccessful, an
27f70 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
27f80 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c  s logged via sql
27f90 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a  ite3_log() and.*
27fa0 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69  * the three vari
27fb0 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20  ables above are 
27fc0 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20  zeroed. In this 
27fd0 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75  case SQLite shou
27fe0 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  ld.** continue a
27ff0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
28000 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
28010 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69  xRead() and xWri
28020 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e  te().** methods.
28030 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28040 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20  unixRemapfile(. 
28050 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20   unixFile *pFd, 
28060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28070 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
28080 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tor object */.  
28090 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20  i64 nNew        
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280b0 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70  /* Required mapp
280c0 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  ing size */.){. 
280d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
280e0 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e  r = "mmap";.  in
280f0 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20  t h = pFd->h;   
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
28120 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62  iptor open on db
28130 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70   file */.  u8 *p
28140 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64  Orig = (u8 *)pFd
28150 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20  ->pMapRegion;   
28160 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
28170 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69  rrent file mappi
28180 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69  ng */.  i64 nOri
28190 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  g = pFd->mmapSiz
281a0 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20  eActual;     /* 
281b0 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65  Size of pOrig re
281c0 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  gion in bytes */
281d0 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b  .  u8 *pNew = 0;
281e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
28200 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69  ion of new mappi
28210 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ng */.  int flag
28220 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20  s = PROT_READ;  
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28240 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
28250 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73   mmap() */..  as
28260 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
28270 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  hOut==0 );.  ass
28280 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d  ert( nNew>pFd->m
28290 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
282a0 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e  ert( nNew<=pFd->
282b0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20  mmapSizeMax );. 
282c0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
282d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  );.  assert( pFd
282e0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
282f0 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  >=pFd->mmapSize 
28300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50  );.  assert( MAP
28310 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23  _FAILED!=0 );..#
28320 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41  ifdef SQLITE_MMA
28330 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20 69 66  P_READWRITE.  if
28340 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
28350 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
28360 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20  NLY)==0 ) flags 
28370 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23  |= PROT_WRITE;.#
28380 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72  endif..  if( pOr
28390 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d  ig ){.#if HAVE_M
283a0 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52  REMAP.    i64 nR
283b0 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  euse = pFd->mmap
283c0 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Size;.#else.    
283d0 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70  const int szSysp
283e0 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73  age = osGetpages
283f0 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e  ize();.    i64 n
28400 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d  Reuse = (pFd->mm
28410 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73  apSize & ~(szSys
28420 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66  page-1));.#endif
28430 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20  .    u8 *pReq = 
28440 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a  &pOrig[nReuse];.
28450 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e  .    /* Unmap an
28460 79 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 65  y pages of the e
28470 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
28480 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72  that cannot be r
28490 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  eused. */.    if
284a0 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20  ( nReuse!=nOrig 
284b0 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  ){.      osMunma
284c0 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52  p(pReq, nOrig-nR
284d0 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  euse);.    }..#i
284e0 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20  f HAVE_MREMAP.  
284f0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61    pNew = osMrema
28500 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c  p(pOrig, nReuse,
28510 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41   nNew, MREMAP_MA
28520 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72  YMOVE);.    zErr
28530 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c   = "mremap";.#el
28540 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
28550 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d  Mmap(pReq, nNew-
28560 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d  nReuse, flags, M
28570 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52  AP_SHARED, h, nR
28580 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  euse);.    if( p
28590 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20  New!=MAP_FAILED 
285a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  ){.      if( pNe
285b0 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20  w!=pReq ){.     
285c0 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77     osMunmap(pNew
285d0 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29  , nNew - nReuse)
285e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
285f0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
28600 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
28610 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20  pOrig;.      }. 
28620 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
28630 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20   /* The attempt 
28640 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65 78  to extend the ex
28650 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66  isting mapping f
28660 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20  ailed. Free it. 
28670 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  */.    if( pNew=
28680 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70  =MAP_FAILED || p
28690 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
286a0 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20  osMunmap(pOrig, 
286b0 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20  nReuse);.    }. 
286c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77   }..  /* If pNew
286d0 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20   is still NULL, 
286e0 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e  try to create an
286f0 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61   entirely new ma
28700 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  pping. */.  if( 
28710 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
28720 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  New = osMmap(0, 
28730 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50  nNew, flags, MAP
28740 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a  _SHARED, h, 0);.
28750 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d    }..  if( pNew=
28760 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
28770 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
28780 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75   nNew = 0;.    u
28790 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
287a0 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64  TE_OK, zErr, pFd
287b0 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f  ->zPath);..    /
287c0 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20  * If the mmap() 
287d0 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73  above failed, as
287e0 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75  sume that all su
287f0 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20  bsequent mmap() 
28800 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c  calls.    ** wil
28810 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20  l probably fail 
28820 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74  too. Fall back t
28830 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  o using xRead/xW
28840 72 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79  rite exclusively
28850 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
28860 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46  case.  */.    pF
28870 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  d->mmapSizeMax =
28880 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70   0;.  }.  pFd->p
28890 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69  MapRegion = (voi
288a0 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d  d *)pNew;.  pFd-
288b0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d  >mmapSize = pFd-
288c0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
288d0 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = nNew;.}../*.**
288e0 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
288f0 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
28900 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
28910 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
28920 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
28930 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
28940 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
28950 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
28960 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
28970 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c   if .** there al
28980 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
28990 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
289a0 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
289b0 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75  are still .** ou
289c0 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
289d0 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
289e0 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
289f0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
28a00 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
28a10 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
28a20 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
28a30 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
28a40 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68  d size of .** th
28a50 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
28a60 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
28a70 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
28a80 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
28a90 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
28aa0 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
28ab0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
28ac0 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
28ad0 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
28ae0 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
28af0 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
28b00 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
28b10 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
28b20 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e  figured .** usin
28b30 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  g SQLITE_FCNTL_M
28b40 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68  MAP_LIMIT, which
28b50 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e  ever is smaller.
28b60 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
28b70 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
28b80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
28b90 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70  (even if the map
28ba0 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72  ping is not.** r
28bb0 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65  ecreated as a re
28bc0 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64  sult of outstand
28bd0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20  ing references) 
28be0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
28bf0 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
28c00 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
28c10 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
28c20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
28c30 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65  64 nMap){.  asse
28c40 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
28c50 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
28c60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   );.  assert( nM
28c70 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d  ap>0 || (pFd->mm
28c80 61 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64  apSize==0 && pFd
28c90 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29  ->pMapRegion==0)
28ca0 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e   );.  if( pFd->n
28cb0 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
28cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
28cd0 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
28ce0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
28cf0 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
28d00 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
28d10 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
28d20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74  */.    if( osFst
28d30 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74  at(pFd->h, &stat
28d40 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  buf) ){.      re
28d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
28d60 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
28d70 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75     nMap = statbu
28d80 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20  f.st_size;.  }. 
28d90 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d   if( nMap>pFd->m
28da0 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20  mapSizeMax ){.  
28db0 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
28dc0 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a  apSizeMax;.  }..
28dd0 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30    assert( nMap>0
28de0 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69   || (pFd->mmapSi
28df0 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d  ze==0 && pFd->pM
28e00 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a  apRegion==0) );.
28e10 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d    if( nMap!=pFd-
28e20 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
28e30 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70   unixRemapfile(p
28e40 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a  Fd, nMap);.  }..
28e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28e60 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
28e70 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
28e80 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
28e90 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
28ea0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
28eb0 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  o a mapping of f
28ec0 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20  ile fd starting 
28ed0 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66  at offset.** iOf
28ee0 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d  f. The mapping m
28ef0 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72  ust be valid for
28f00 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62   at least nAmt b
28f10 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ytes..**.** If s
28f20 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61  uch a pointer ca
28f30 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73  n be obtained, s
28f40 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61  tore it in *pp a
28f50 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
28f60 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  _OK..** Or, if o
28f70 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f  ne cannot but no
28f80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
28f90 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20  et *pp to 0 and 
28fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28fb0 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ..** Finally, if
28fc0 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
28fd0 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20  ccur, return an 
28fe0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
28ff0 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20  e. The final.** 
29000 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20  value of *pp is 
29010 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
29020 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
29030 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
29040 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  oes return a poi
29050 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  nter, the caller
29060 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79   must eventually
29070 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65   .** release the
29080 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61   reference by ca
29090 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63  lling unixUnfetc
290a0 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
290b0 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c  nt unixFetch(sql
290c0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
290d0 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d  64 iOff, int nAm
290e0 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23  t, void **pp){.#
290f0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
29100 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
29110 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
29120 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
29130 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
29140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29150 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20  .#endif.  *pp = 
29160 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  0;..#if SQLITE_M
29170 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
29180 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69   if( pFd->mmapSi
29190 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69  zeMax>0 ){.    i
291a0 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
291b0 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  on==0 ){.      i
291c0 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66  nt rc = unixMapf
291d0 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20  ile(pFd, -1);.  
291e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
291f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
29200 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
29210 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
29220 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
29230 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
29240 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
29250 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
29260 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
29270 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
29280 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
29290 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
292a0 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72   If the third ar
292b0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55  gument is non-NU
292c0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
292d0 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20  nction releases 
292e0 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  a .** reference 
292f0 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
29300 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75  arlier call to u
29310 6e 69 78 46 65 74 63 68 28 29 2e 20 54 68 65 20  nixFetch(). The 
29320 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
29330 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
29340 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
29350 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
29360 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
29370 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61  .** argument tha
29380 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  t was passed to 
29390 74 68 65 20 75 6e 69 78 46 65 74 63 68 28 29 20  the unixFetch() 
293a0 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a  invocation. .**.
293b0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68  ** Or, if the th
293c0 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
293d0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
293e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
293f0 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20  g called .** to 
29400 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c  inform the VFS l
29410 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72  ayer that, accor
29420 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61  ding to POSIX, a
29430 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
29440 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20  ing .** may now 
29450 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  be invalid and s
29460 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65  hould be unmappe
29470 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29480 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c   unixUnfetch(sql
29490 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
294a0 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70  64 iOff, void *p
294b0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
294c0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
294d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
294e0 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20  (unixFile *)fd; 
294f0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
29500 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
29510 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  e */.  UNUSED_PA
29520 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a  RAMETER(iOff);..
29530 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e    /* If p==0 (un
29540 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66  map the entire f
29550 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20  ile) then there 
29560 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74  must be no outst
29570 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65  anding .  ** xFe
29580 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
29590 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
295a0 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
295b0 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
295c0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
295d0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
295e0 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
295f0 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
29600 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
29610 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
29620 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
29630 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
29640 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
29650 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
29660 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
29670 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
29680 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20  ff] );..  if( p 
29690 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74  ){.    pFd->nFet
296a0 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65  chOut--;.  }else
296b0 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66  {.    unixUnmapf
296c0 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20  ile(pFd);.  }.. 
296d0 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
296e0 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65  etchOut>=0 );.#e
296f0 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
29700 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
29710 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
29720 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
29730 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e  METER(iOff);.#en
29740 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
29750 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
29760 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
29770 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
29780 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
29790 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
297a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297b0 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
297c0 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
297d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
297f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
29840 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
29850 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  on contains defi
29860 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74  nitions of sqlit
29870 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29880 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d  jects that.** im
29890 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20  plement various 
298a0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  file locking str
298b0 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73  ategies.  It als
298c0 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  o contains defin
298d0 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69  itions.** of "fi
298e0 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e  nder" functions.
298f0 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74    A finder-funct
29900 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ion is used to l
29910 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70  ocate the approp
29920 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33  riate.** sqlite3
29930 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29940 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ct for a particu
29950 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  lar database fil
29960 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  e.  The pAppData
29970 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
29980 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53   sqlite3_vfs VFS
29990 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69   objects are ini
299a0 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70  tialized to be p
299b0 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68  ointers to.** th
299c0 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72  e correct finder
299d0 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68  -function for th
299e0 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  at VFS..**.** Mo
299f0 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  st finder functi
29a00 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ons return a poi
29a10 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
29a20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29a30 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54  ds.** object.  T
29a40 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74  he only interest
29a50 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ing finder-funct
29a60 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49  ion is autolockI
29a70 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a  oFinder, which.*
29a80 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  * looks at the f
29a90 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61  ilesystem type a
29aa0 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73  nd tries to gues
29ab0 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  s the best locki
29ac0 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66  ng.** strategy f
29ad0 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20  rom that..**.** 
29ae0 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  For finder-funct
29af0 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63  ion F, two objec
29b00 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a  ts are created:.
29b10 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65  **.**    (1) The
29b20 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e   real finder-fun
29b30 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d  ction named "FIm
29b40 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pt()"..**.**    
29b50 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70  (2) A constant p
29b60 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66  ointer to this f
29b70 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75  unction named ju
29b80 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  st "F"..**.**.**
29b90 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
29ba0 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75  e F pointer is u
29bb0 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44  sed as the pAppD
29bc0 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46  ata value for VF
29bd0 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57  S.** objects.  W
29be0 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
29bf0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  s instead of let
29c00 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f  ting pAppData po
29c10 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20  int.** directly 
29c20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75  at the finder-fu
29c30 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30  nction since C90
29c40 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61   rules prevent a
29c50 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62   void*.** from b
29c60 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75  e cast into a fu
29c70 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a  nction pointer..
29c80 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  **.**.** Each in
29c90 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d  stance of this m
29ca0 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74  acro generates t
29cb0 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a  wo objects:.**.*
29cc0 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e  *   *  A constan
29cd0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
29ce0 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c  hods object call
29cf0 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73   METHOD that has
29d00 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
29d10 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20   methods CLOSE, 
29d20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
29d30 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20  RESLOCK..**.**  
29d40 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f   *  An I/O metho
29d50 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
29d60 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20  n called FINDER 
29d70 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70  that returns a p
29d80 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74  ointer.**      t
29d90 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a  o the METHOD obj
29da0 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ect in the previ
29db0 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23  ous bullet..*/.#
29dc0 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53  define IOMETHODS
29dd0 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56  (FINDER,METHOD,V
29de0 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43  ERSION,CLOSE,LOC
29df0 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c  K,UNLOCK,CKLOCK,
29e00 53 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74  SHMMAP)     \.st
29e10 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
29e20 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
29e30 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29e60 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
29e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
29e80 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ea0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
29eb0 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
29ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
29ed0 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
29ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ef0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
29f00 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
29f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
29f20 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
29f50 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
29f60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
29f70 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f90 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29fa0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
29fb0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
29fc0 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fe0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
29ff0 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
2a000 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
2a010 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a030 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
2a040 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
2a050 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
2a060 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
2a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a080 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0f0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
2a100 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a120 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a140 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2a150 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
2a180 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
2a190 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
2a1a0 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1c0 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
2a1d0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
2a1e0 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
2a1f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a210 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
2a220 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
2a230 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
2a240 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2a260 20 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20     SHMMAP,      
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a280 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20  * xShmMap */    
2a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2a2b0 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20    unixShmLock,  
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a2d0 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20   xShmLock */    
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2a300 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c   unixShmBarrier,
2a310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a320 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20  xShmBarrier */  
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2a350 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20  unixShmUnmap,   
2a360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a370 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20  ShmUnmap */     
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2a3a0 6e 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20  nixFetch,       
2a3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
2a3c0 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2a3f0 69 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20  ixUnfetch,      
2a400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2a410 66 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20  fetch */        
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a430 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20          \.};    
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a480 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
2a490 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a4a0 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52  _methods *FINDER
2a4b0 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61  ##Impl(const cha
2a4c0 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a  r *z, unixFile *
2a4d0 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44  p){   \.  UNUSED
2a4e0 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55  _PARAMETER(z); U
2a4f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a500 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20       \.  return 
2a530 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20  &METHOD;        
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20      \.}         
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5c0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
2a5d0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2a5e0 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49  hods *(*const FI
2a5f0 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72  NDER)(const char
2a600 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20  *,unixFile *p)  
2a610 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52    \.    = FINDER
2a620 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ##Impl;../*.** H
2a630 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74  ere are all of t
2a640 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2a650 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f  thods objects fo
2a660 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
2a670 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
2a680 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20  ies.  Functions 
2a690 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e  that return poin
2a6a0 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65  ters to these me
2a6b0 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73  thods.** are als
2a6c0 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f  o created..*/.IO
2a6d0 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78  METHODS(.  posix
2a6e0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2a6f0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2a700 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2a710 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73    posixIoMethods
2a720 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
2a730 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a740 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2a750 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
2a760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a770 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e  shared memory an
2a780 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c  d mmap are enabl
2a790 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
2a7a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2a7b0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2a7c0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
2a7d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a7e0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2a7f0 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  d */.  unixUnloc
2a800 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2a810 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2a820 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
2a830 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2a840 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2a850 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2a860 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  /.  unixShmMap  
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a880 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2a890 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
2a8a0 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
2a8b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
2a8c0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2a8d0 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
2a8e0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2a8f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2a900 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2a910 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20  name */.  3,    
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a930 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2a940 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2a950 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
2a960 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2a970 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2a980 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
2a990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a9a0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2a9b0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
2a9c0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
2a9d0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2a9e0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
2a9f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2aa00 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2aa10 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2aa20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2aa40 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2aa50 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
2aa60 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
2aa70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2aa80 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2aa90 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
2aaa0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2aab0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2aac0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2aad0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaf0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2ab00 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2ab10 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
2ab20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2ab30 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2ab40 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
2ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ab60 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2ab70 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
2ab80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2ab90 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2aba0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
2abb0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a  ReservedLock, /*
2abc0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2abd0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2abe0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2abf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2ac00 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2ac10 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2ac20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2ac30 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66  E.IOMETHODS(.  f
2ac40 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
2ac50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
2ac60 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
2ac70 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74   */.  flockIoMet
2ac80 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
2ac90 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2aca0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2acb0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acd0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
2ace0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
2acf0 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20  .  flockClose,  
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad10 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2ad20 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20  .  flockLock,   
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad40 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
2ad50 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20    flockUnlock,  
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ad70 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2ad80 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  .  flockCheckRes
2ad90 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20  ervedLock,   /* 
2ada0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2adb0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2ade0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2adf0 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
2ae00 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
2ae10 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae30 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2ae40 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
2ae50 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2ae60 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2ae70 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2ae80 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aea0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2aeb0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2aec0 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73  ed */.  semXClos
2aed0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2aee0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2aef0 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b  od */.  semXLock
2af00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2af10 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2af20 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63  d */.  semXUnloc
2af30 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2af40 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2af50 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63  od */.  semXChec
2af60 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2af70 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2af80 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2af90 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2afb0 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2afc0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2afd0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2afe0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2aff0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b000 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
2b010 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
2b020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2b030 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2b040 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
2b050 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
2b060 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2b070 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2b080 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2b0b0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2b0c0 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b0e0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2b0f0 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b110 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2b120 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b140 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2b150 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
2b160 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a  rvedLock,     /*
2b170 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2b180 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b190 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2b1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2b1b0 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2b1c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2b1d0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
2b1e0 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
2b1f0 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
2b200 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
2b210 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
2b220 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
2b230 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
2b240 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
2b250 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
2b260 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
2b270 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
2b280 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
2b290 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
2b2a0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
2b2b0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
2b2c0 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
2b2d0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
2b2e0 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
2b2f0 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
2b300 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
2b310 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
2b320 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
2b330 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
2b340 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
2b350 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
2b360 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
2b370 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
2b380 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
2b390 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
2b3a0 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
2b3b0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
2b3c0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2b3d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b3e0 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
2b3f0 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
2b400 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
2b410 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
2b420 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
2b430 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
2b440 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
2b450 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2b460 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
2b470 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
2b480 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
2b490 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
2b4a0 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
2b4b0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2b4c0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2b4d0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2b4e0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
2b4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2b500 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b510 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2b520 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2b530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2b540 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2b550 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  isabled */.  pro
2b560 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
2b570 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2b580 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
2b590 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
2b5a0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2b5b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
2b5c0 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
2b5d0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2b5e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
2b5f0 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
2b600 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock,   /* xCheck
2b610 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2b620 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b640 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2b650 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2b660 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
2b670 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
2b680 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
2b690 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
2b6a0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
2b6b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2b6c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2b6d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b6e0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2b6f0 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b710 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2b720 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
2b730 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2b740 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2b750 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2b760 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b780 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2b790 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2b7a0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
2b7b0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2b7c0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2b7d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2b7e0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2b7f0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2b800 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
2b810 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2b820 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2b830 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
2b840 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
2b850 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65  ock,     /* xChe
2b860 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2b870 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b890 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2b8a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2b8b0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
2b8c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2b8d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2b8e0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a  KING_STYLE./* .*
2b8f0 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
2b900 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
2b910 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  s to determine t
2b920 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20  he best locking 
2b930 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72  strategy .** for
2b940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b950 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20  le "filePath".  
2b960 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  It then returns 
2b970 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
2b980 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
2b990 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2b9a0 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
2b9b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f  **.** This is fo
2b9c0 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a  r MacOSX only..*
2b9d0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2b9e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b9f0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
2ba00 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
2ba10 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
2ba20 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
2ba30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ba40 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2ba50 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
2ba60 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  * open file obje
2ba70 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ct for the datab
2ba80 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ase file */.){. 
2ba90 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2baa0 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20  ruct Mapping {. 
2bab0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2bac0 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20  Filesystem;     
2bad0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2bae0 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65  system type name
2baf0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71   */.    const sq
2bb00 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2bb10 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a   *pMethods;   /*
2bb20 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   Appropriate loc
2bb30 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  king method */. 
2bb40 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20   } aMap[] = {.  
2bb50 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70    { "hfs",    &p
2bb60 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
2bb70 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20  .    { "ufs",   
2bb80 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2bb90 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73   },.    { "afpfs
2bba0 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
2bbb0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66  s },.    { "smbf
2bbc0 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
2bbd0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62  ds },.    { "web
2bbe0 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  dav", &nolockIoM
2bbf0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2bc00 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0, 0 }.  };.  in
2bc10 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
2bc20 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73  atfs fsInfo;.  s
2bc30 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
2bc40 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
2bc50 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
2bc60 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
2bc70 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
2bc80 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2bc90 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
2bca0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
2bcb0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2bcc0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
2bcd0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2bce0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20  IoMethods;.  }. 
2bcf0 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65   if( statfs(file
2bd00 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
2bd10 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  = -1 ){.    if( 
2bd20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
2bd30 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20   MNT_RDONLY ){. 
2bd40 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c       return &nol
2bd50 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2bd60 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
2bd70 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
2bd80 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  stem; i++){.    
2bd90 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
2bda0 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2bdb0 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  , aMap[i].zFiles
2bdc0 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  ystem)==0 ){.   
2bdd0 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70       return aMap
2bde0 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20  [i].pMethods;.  
2bdf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2be00 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61  .  /* Default ca
2be10 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f  se. Handles, amo
2be20 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66  ngst others, "nf
2be30 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79  s"..  ** Test by
2be40 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73  te-range lock us
2be50 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20  ing fcntl(). If 
2be60 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64  the call succeed
2be70 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  s, .  ** assume 
2be80 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79  that the file-sy
2be90 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f  stem supports PO
2bea0 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
2beb0 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66   .  */.  lockInf
2bec0 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2bed0 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2bee0 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2bef0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2bf00 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2bf10 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2bf20 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2bf30 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2bf40 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2bf50 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72   ) {.    if( str
2bf60 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2bf70 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d  ypename, "nfs")=
2bf80 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2bf90 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  rn &nfsIoMethods
2bfa0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
2bfb0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73       return &pos
2bfc0 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ixIoMethods;.   
2bfd0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2bfe0 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49  return &dotlockI
2bff0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
2c000 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2c010 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c020 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
2c030 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
2c040 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2c050 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
2c060 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
2c070 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
2c080 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2c090 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2c0a0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
2c0b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a  f OS_VXWORKS./*.
2c0c0 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
2c0d0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78   function for Vx
2c0e0 57 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20  Works checks to 
2c0f0 73 65 65 20 69 66 20 70 6f 73 69 78 20 61 64 76  see if posix adv
2c100 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  isory.** locking
2c110 20 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64   works.  If it d
2c120 6f 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69  oes, then that i
2c130 73 20 77 68 61 74 20 69 73 20 75 73 65 64 2e 20  s what is used. 
2c140 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a   If it does not.
2c150 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61  ** work, then fa
2c160 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20  llback to named 
2c170 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
2c180 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  g..*/.static con
2c190 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2c1a0 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f  thods *vxworksIo
2c1b0 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
2c1c0 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
2c1d0 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
2c1e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2c1f0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
2c200 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
2c210 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69    /* the open fi
2c220 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  le object */.){.
2c230 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
2c240 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
2c250 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
2c260 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
2c270 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
2c280 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
2c290 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
2c2a0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
2c2b0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2c2c0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
2c2d0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
2c2e0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2c2f0 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20  }..  /* Test if 
2c300 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f  fcntl() is suppo
2c310 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53  rted and use POS
2c320 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a  IX style locks..
2c330 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66    ** Otherwise f
2c340 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
2c350 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
2c360 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c  method..  */.  l
2c370 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
2c380 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
2c390 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
2c3a0 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
2c3b0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
2c3c0 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
2c3d0 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
2c3e0 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
2c3f0 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
2c400 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
2c410 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
2c420 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
2c430 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49      return &semI
2c440 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
2c450 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2c460 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c470 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f  .  *(*const vxwo
2c480 72 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  rksIoFinder)(con
2c490 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2c4a0 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46  e*) = vxworksIoF
2c4b0 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2c4c0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
2c4d0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
2c4e0 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
2c4f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2c500 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  IO method finder
2c510 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79   function:.*/.ty
2c520 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69  pedef const sqli
2c530 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2c540 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63  (*finder_type)(c
2c550 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
2c560 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ile*);.../******
2c570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2c5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5d0 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
2c5e0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
2c5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c600 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
2c610 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
2c620 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
2c630 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
2c640 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
2c650 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
2c660 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2c670 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
2c680 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
2c690 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
2c6a0 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
2c6b0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
2c6c0 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
2c6d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2c6e0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2c6f0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
2c700 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
2c710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2c720 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
2c730 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
2c740 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
2c750 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20  ite3_file *pId, 
2c760 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
2c770 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
2c780 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
2c790 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2c7a0 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
2c7b0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
2c7c0 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
2c7d0 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20  int ctrlFlags   
2c7e0 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20          /* Zero 
2c7f0 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45  or more UNIXFILE
2c800 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  _* values */.){.
2c810 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2c820 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63  io_methods *pLoc
2c830 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69  kingStyle;.  uni
2c840 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75  xFile *pNew = (u
2c850 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20  nixFile *)pId;. 
2c860 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c870 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2c880 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55  pNew->pInode==NU
2c890 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c  LL );..  /* No l
2c8a0 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e  ocking occurs in
2c8b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
2c8c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46   */.  assert( zF
2c8d0 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63  ilename!=0 || (c
2c8e0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2c8f0 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29  ILE_NOLOCK)!=0 )
2c900 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
2c910 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
2c920 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
2c930 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  );.  pNew->h = h
2c940 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d  ;.  pNew->pVfs =
2c950 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a   pVfs;.  pNew->z
2c960 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2c970 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c  ;.  pNew->ctrlFl
2c980 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c  ags = (u8)ctrlFl
2c990 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ags;.#if SQLITE_
2c9a0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
2c9b0 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65    pNew->mmapSize
2c9c0 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Max = sqlite3Glo
2c9d0 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
2c9e0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  ;.#endif.  if( s
2c9f0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2ca00 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26  an(((ctrlFlags &
2ca10 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f   UNIXFILE_URI) ?
2ca20 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c   zFilename : 0),
2ca30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f              "pso
2ca50 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
2ca60 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
2ca70 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
2ca80 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2ca90 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69  LE_PSOW;.  }.  i
2caa0 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e  f( strcmp(pVfs->
2cab0 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c  zName,"unix-excl
2cac0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ")==0 ){.    pNe
2cad0 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2cae0 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20  UNIXFILE_EXCL;. 
2caf0 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
2cb00 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d  KS.  pNew->pId =
2cb10 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65   vxworksFindFile
2cb20 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  Id(zFilename);. 
2cb30 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d   if( pNew->pId==
2cb40 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61  0 ){.    ctrlFla
2cb50 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
2cb60 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  OLOCK;.    rc = 
2cb70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2cb80 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
2cb90 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26   if( ctrlFlags &
2cba0 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2cbb0 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
2cbc0 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
2cbd0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2cbe0 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
2cbf0 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
2cc00 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
2cc10 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
2cc20 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
2cc30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2cc40 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
2cc50 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
2cc60 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
2cc70 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
2cc80 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
2cc90 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
2cca0 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
2ccb0 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
2ccc0 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
2ccd0 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
2cce0 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
2ccf0 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
2cd00 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
2cd10 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
2cd20 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
2cd30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2cd40 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
2cd50 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
2cd60 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2cd70 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
2cd80 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
2cd90 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2cda0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2cdb0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
2cdc0 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
2cdd0 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
2cde0 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20  .#endif.  ){.   
2cdf0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2ce00 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
2ce10 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
2ce20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
2ce30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ce40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
2ce50 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2ce60 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e  curred in findIn
2ce70 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65  odeInfo(), close
2ce80 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2ce90 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d  ptor.      ** im
2cea0 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72  mediately, befor
2ceb0 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  e releasing the 
2cec0 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65  mutex. findInode
2ced0 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a  Info() may fail.
2cee0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20        ** in two 
2cef0 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20  scenarios:.     
2cf00 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28   **.      **   (
2cf10 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74  a) A call to fst
2cf20 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20  at() failed..   
2cf30 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61     **   (b) A ma
2cf40 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20  lloc failed..   
2cf50 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53     **.      ** S
2cf60 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20  cenario (b) may 
2cf70 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68  only occur if th
2cf80 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  e process is hol
2cf90 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20  ding no other.  
2cfa0 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63      ** file desc
2cfb0 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  riptors open on 
2cfc0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49  the same file. I
2cfd0 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68  f there were oth
2cfe0 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  er file.      **
2cff0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20   descriptors on 
2d000 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20  this file, then 
2d010 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20  no malloc would 
2d020 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  be required by. 
2d030 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64       ** findInod
2d040 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73  eInfo(). If this
2d050 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74   is the case, it
2d060 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74   is quite safe t
2d070 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a  o close.      **
2d080 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69   handle h - as i
2d090 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
2d0a0 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f  that no posix lo
2d0b0 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65  cks will be rele
2d0c0 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ased.      ** by
2d0d0 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20   doing so..     
2d0e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
2d0f0 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75  scenario (a) cau
2d100 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68  sed the error th
2d110 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f  en things are no
2d120 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20  t so safe. The. 
2d130 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74       ** implicit
2d140 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65   assumption here
2d150 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61   is that if fsta
2d160 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67  t() fails, thing
2d170 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a  s are in.      *
2d180 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65  * such bad shape
2d190 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61   that dropping a
2d1a0 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65   lock or two doe
2d1b0 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68  sn't matter much
2d1c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d1d0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2d1e0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2d1f0 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a  ;.      h = -1;.
2d200 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2d210 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2d220 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2d230 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2d240 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
2d250 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  PLE__).  else if
2d260 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2d270 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
2d280 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c   ){.    /* AFP l
2d290 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2d2a0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2d2b0 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
2d2c0 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
2d2d0 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
2d2e0 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  text..    */.   
2d2f0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
2d300 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e  xt *pCtx;.    pN
2d310 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2d320 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69  xt = pCtx = sqli
2d330 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
2d340 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
2d350 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
2d360 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2d370 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2d380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d390 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
2d3a0 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
2d3b0 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2d3c0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
2d3d0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
2d3e0 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
2d3f0 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
2d400 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
2d410 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
2d420 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
2d430 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
2d440 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
2d450 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
2d460 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
2d470 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
2d480 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
2d490 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2d4a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
2d4b0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2d4c0 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2d4d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2d4e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d4f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2d500 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
2d510 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2d520 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2d530 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2d540 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
2d550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d560 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2d570 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
2d580 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
2d590 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2d5a0 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
2d5b0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2d5c0 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
2d5d0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2d5e0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2d5f0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2d600 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2d610 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
2d620 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
2d630 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
2d640 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
2d650 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74  name;.    assert
2d660 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29  ( zFilename!=0 )
2d670 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20  ;.    nFilename 
2d680 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
2d690 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
2d6a0 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63    zLockFile = (c
2d6b0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
2d6c0 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61 6d 65  lloc64(nFilename
2d6d0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
2d6e0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2d6f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2d700 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  EM_BKPT;.    }el
2d710 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2d720 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
2d730 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
2d740 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55   "%s" DOTLOCK_SU
2d750 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  FFIX, zFilename)
2d760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
2d770 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2d780 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20   = zLockFile;.  
2d790 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2d7a0 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  S.  else if( pLo
2d7b0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73  ckingStyle == &s
2d7c0 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  emIoMethods ){. 
2d7d0 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61     /* Named sema
2d7e0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73  phore locking us
2d7f0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2d800 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2d810 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64  be.    ** includ
2d820 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63  ed in the semLoc
2d830 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20  kingContext.    
2d840 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  */.    unixEnter
2d850 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
2d860 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
2d870 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
2d880 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ode);.    if( (r
2d890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
2d8a0 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e   (pNew->pInode->
2d8b0 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
2d8c0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
2d8d0 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f  ame = pNew->pIno
2d8e0 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20  de->aSemName;.  
2d8f0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2d900 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2d910 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
2d920 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73  zSemName, "/%s.s
2d930 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  em",.           
2d940 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
2d950 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
2d960 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  lName);.      fo
2d970 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65  r( n=1; zSemName
2d980 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20  [n]; n++ ).     
2d990 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b     if( zSemName[
2d9a0 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61  n]=='/' ) zSemNa
2d9b0 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20  me[n] = '_';.   
2d9c0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2d9d0 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e  >pSem = sem_open
2d9e0 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45  (zSemName, O_CRE
2d9f0 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20  AT, 0666, 1);.  
2da00 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49      if( pNew->pI
2da10 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  node->pSem == SE
2da20 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
2da30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2da40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2da50 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
2da60 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20  ->aSemName[0] = 
2da70 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20  '\0';.      }.  
2da80 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2da90 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
2daa0 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c  ndif.  .  storeL
2dab0 61 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30  astErrno(pNew, 0
2dac0 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
2dad0 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  S.  if( rc!=SQLI
2dae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2daf0 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
2db00 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2db10 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d  LINE__);.    h =
2db20 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e   -1;.    osUnlin
2db30 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
2db40 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2db50 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
2db60 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  LETE;.  }.#endif
2db70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2db80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2db90 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
2dba0 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2dbb0 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b  INE__);.  }else{
2dbc0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68  .    pNew->pMeth
2dbd0 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79  od = pLockingSty
2dbe0 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  le;.    OpenCoun
2dbf0 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72  ter(+1);.    ver
2dc00 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b  ifyDbFile(pNew);
2dc10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2dc20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2dc30 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
2dc40 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69  directory in whi
2dc50 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72  ch to put tempor
2dc60 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66  ary files..** If
2dc70 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d   no suitable tem
2dc80 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65  porary file dire
2dc90 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75  ctory can be fou
2dca0 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  nd, return NULL.
2dcb0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2dcc0 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46   char *unixTempF
2dcd0 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20  ileDir(void){.  
2dce0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2dcf0 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
2dd00 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a       0,.     0,.
2dd10 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
2dd20 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22  .     "/usr/tmp"
2dd30 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20  ,.     "/tmp",. 
2dd40 20 20 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75      ".".  };.  u
2dd50 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20  nsigned int i = 
2dd60 30 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  0;.  struct stat
2dd70 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
2dd80 61 72 20 2a 7a 44 69 72 20 3d 20 73 71 6c 69 74  ar *zDir = sqlit
2dd90 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2dda0 79 3b 0a 0a 20 20 69 66 28 20 21 61 7a 44 69 72  y;..  if( !azDir
2ddb0 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d  s[0] ) azDirs[0]
2ddc0 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
2ddd0 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 69 66  E_TMPDIR");.  if
2dde0 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61  ( !azDirs[1] ) a
2ddf0 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e  zDirs[1] = geten
2de00 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 77  v("TMPDIR");.  w
2de10 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28  hile(1){.    if(
2de20 20 7a 44 69 72 21 3d 30 0a 20 20 20 20 20 26 26   zDir!=0.     &&
2de30 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62   osStat(zDir, &b
2de40 75 66 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 53  uf)==0.     && S
2de50 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
2de60 64 65 29 0a 20 20 20 20 20 26 26 20 6f 73 41 63  de).     && osAc
2de70 63 65 73 73 28 7a 44 69 72 2c 20 30 33 29 3d 3d  cess(zDir, 03)==
2de80 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  0.    ){.      r
2de90 65 74 75 72 6e 20 7a 44 69 72 3b 0a 20 20 20 20  eturn zDir;.    
2dea0 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 73 69 7a  }.    if( i>=siz
2deb0 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
2dec0 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 20 29 20  of(azDirs[0]) ) 
2ded0 62 72 65 61 6b 3b 0a 20 20 20 20 7a 44 69 72 20  break;.    zDir 
2dee0 3d 20 61 7a 44 69 72 73 5b 69 2b 2b 5d 3b 0a 20  = azDirs[i++];. 
2def0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2df00 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2df10 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2df20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a  name in zBuf.  z
2df30 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  Buf must be allo
2df40 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  cated.** by the 
2df50 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20  calling process 
2df60 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20  and must be big 
2df70 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61  enough to hold a
2df80 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d  t least.** pVfs-
2df90 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  >mxPathname byte
2dfa0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2dfb0 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
2dfc0 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
2dfd0 2a 7a 42 75 66 29 7b 0a 20 20 63 6f 6e 73 74 20  *zBuf){.  const 
2dfe0 63 68 61 72 20 2a 7a 44 69 72 3b 0a 20 20 69 6e  char *zDir;.  in
2dff0 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20  t iLimit = 0;.. 
2e000 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
2e010 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
2e020 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
2e030 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
2e040 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
2e050 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
2e060 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
2e070 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
2e080 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
2e090 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
2e0a0 2e 20 0a 20 20 2a 2f 0a 20 20 7a 42 75 66 5b 30  . .  */.  zBuf[0
2e0b0 5d 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61 74  ] = 0;.  Simulat
2e0c0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2e0d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
2e0e0 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54  ..  zDir = unixT
2e0f0 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20  empFileDir();.  
2e100 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 65  if( zDir==0 ) re
2e110 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2e120 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3b 0a 20  R_GETTEMPPATH;. 
2e130 20 64 6f 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a   do{.    u64 r;.
2e140 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2e150 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29  omness(sizeof(r)
2e160 2c 20 26 72 29 3b 0a 20 20 20 20 61 73 73 65 72  , &r);.    asser
2e170 74 28 20 6e 42 75 66 3e 32 20 29 3b 0a 20 20 20  t( nBuf>2 );.   
2e180 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 20 3d 20   zBuf[nBuf-2] = 
2e190 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  0;.    sqlite3_s
2e1a0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
2e1b0 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
2e1c0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2e1d0 22 25 6c 6c 78 25 63 22 2c 0a 20 20 20 20 20 20  "%llx%c",.      
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2e1f0 44 69 72 2c 20 72 2c 20 30 29 3b 0a 20 20 20 20  Dir, r, 0);.    
2e200 69 66 28 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d  if( zBuf[nBuf-2]
2e210 21 3d 30 20 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b  !=0 || (iLimit++
2e220 29 3e 31 30 20 29 20 72 65 74 75 72 6e 20 53 51  )>10 ) return SQ
2e230 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 77  LITE_ERROR;.  }w
2e240 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a  hile( osAccess(z
2e250 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
2e260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e270 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
2e280 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2e290 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
2e2a0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
2e2b0 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73  Routine to trans
2e2c0 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20  form a unixFile 
2e2d0 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63  into a proxy-loc
2e2e0 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  king unixFile..*
2e2f0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2e300 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f   in the proxy-lo
2e310 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74  ck division, but
2e320 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65   used by unixOpe
2e330 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  n().** if SQLITE
2e340 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2e350 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64  CKING is defined
2e360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e370 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
2e380 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a  ixFile(unixFile*
2e390 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
2e3a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
2e3b0 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
2e3c0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2e3d0 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
2e3e0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
2e3f0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74  se .** file (not
2e400 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61   a journal or ma
2e410 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
2e420 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  e) identified by
2e430 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61   pathname.** zPa
2e440 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  th with SQLITE_O
2e450 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61  PEN_XXX flags ma
2e460 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73  tching those pas
2e470 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2e480 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  d.** argument to
2e490 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2e4a0 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c  **.** Such a fil
2e4b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
2e4c0 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61   exist if a data
2e4d0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2e4e0 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75  was closed.** bu
2e4f0 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
2e500 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e510 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c   could not be cl
2e520 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d  osed because som
2e530 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20  e.** other file 
2e540 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
2e550 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
2e560 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69   is holding a fi
2e570 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65  le-lock..** Refe
2e580 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  r to comments in
2e590 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29   the unixClose()
2e5a0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68   function and th
2e5b0 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e  e lengthy commen
2e5c0 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  t.** describing 
2e5d0 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20  "Posix Advisory 
2e5e0 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20  Locking" at the 
2e5f0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69  start of this fi
2e600 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68  le for .** furth
2e610 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f  er details. Also
2e620 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a  , ticket #4018..
2e630 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61  **.** If a suita
2e640 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
2e650 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  tor is found, th
2e660 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  en it is returne
2e670 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68  d. If no.** such
2e680 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e690 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20   is located, -1 
2e6a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2e6b0 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65  static UnixUnuse
2e6c0 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c  dFd *findReusabl
2e6d0 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eFd(const char *
2e6e0 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
2e6f0 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  ){.  UnixUnusedF
2e700 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  d *pUnused = 0;.
2e710 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61  .  /* Do not sea
2e720 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
2e730 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2e740 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f  r on vxworks. No
2e750 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76  t because.  ** v
2e760 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74  xworks would not
2e770 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68   benefit from th
2e780 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67  e change (it mig
2e790 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75  ht, we're not su
2e7a0 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65  re),.  ** but be
2e7b0 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20  cause no way to 
2e7c0 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65  test it is curre
2e7d0 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20  ntly available. 
2e7e0 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20  It is better .  
2e7f0 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62  ** not to risk b
2e800 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20  reaking vxworks 
2e810 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20  support for the 
2e820 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20  sake of such an 
2e830 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65  obscure .  ** fe
2e840 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21  ature.  */.#if !
2e850 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
2e860 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e880 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20    /* Results of 
2e890 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  stat() call */..
2e8a0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2e8b0 28 29 3b 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74  ();..  /* A stat
2e8c0 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c  () call may fail
2e8d0 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61   for various rea
2e8e0 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61  sons. If this ha
2e8f0 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a  ppens, it is.  *
2e900 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  * almost certain
2e910 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20   that an open() 
2e920 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65  call on the same
2e930 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20   path will also 
2e940 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74  fail..  ** For t
2e950 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61  his reason, if a
2e960 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
2e970 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c  n the stat() cal
2e980 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20  l here, it is.  
2e990 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d  ** ignored and -
2e9a0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  1 is returned. T
2e9b0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74  he caller will t
2e9c0 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  ry to open a new
2e9d0 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72   file.  ** descr
2e9e0 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d  iptor on the sam
2e9f0 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e  e path, fail, an
2ea00 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  d return an erro
2ea10 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a  r to SQLite..  *
2ea20 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61  *.  ** Even if a
2ea30 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e   subsequent open
2ea40 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63  () call does suc
2ea50 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71  ceed, the conseq
2ea60 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e  uences of.  ** n
2ea70 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  ot searching for
2ea80 20 61 20 72 65 75 73 61 62 6c 65 20 66 69 6c 65   a reusable file
2ea90 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
2eaa0 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
2eab0 69 66 28 20 6e 55 6e 75 73 65 64 46 64 3e 30 20  if( nUnusedFd>0 
2eac0 26 26 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  && 0==osStat(zPa
2ead0 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  th, &sStat) ){. 
2eae0 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f     unixInodeInfo
2eaf0 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 70   *pInode;..    p
2eb00 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73  Inode = inodeLis
2eb10 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49  t;.    while( pI
2eb20 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d  node && (pInode-
2eb30 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74  >fileId.dev!=sSt
2eb40 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20  at.st_dev.      
2eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2eb60 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  | pInode->fileId
2eb70 2e 69 6e 6f 21 3d 28 75 36 34 29 73 53 74 61 74  .ino!=(u64)sStat
2eb80 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20  .st_ino) ){.    
2eb90 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
2eba0 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  de->pNext;.    }
2ebb0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20  .    if( pInode 
2ebc0 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75  ){.      UnixUnu
2ebd0 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20  sedFd **pp;.    
2ebe0 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
2ebf0 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
2ec00 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
2ec10 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
2ec20 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
2ec30 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
2ec40 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
2ec50 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 55  ed ){.        nU
2ec60 6e 75 73 65 64 46 64 2d 2d 3b 0a 20 20 20 20 20  nusedFd--;.     
2ec70 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
2ec80 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2ec90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 75 6e 69  .    }.  }.  uni
2eca0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 23  xLeaveMutex();.#
2ecb0 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21  endif    /* if !
2ecc0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20  OS_VXWORKS */.  
2ecd0 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a  return pUnused;.
2ece0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
2ecf0 65 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20  e mode, uid and 
2ed00 67 69 64 20 6f 66 20 66 69 6c 65 20 7a 46 69 6c  gid of file zFil
2ed10 65 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e. .*/.static in
2ed20 74 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 0a 20  t getFileMode(. 
2ed30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2ed40 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
2ed50 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 2a 2f   /* File name */
2ed60 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
2ed70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed80 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
2ed90 73 73 69 6f 6e 73 20 6f 66 20 7a 46 69 6c 65 20  ssions of zFile 
2eda0 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64  */.  uid_t *pUid
2edb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2edc0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64       /* OUT: uid
2edd0 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 20 20   of zFile. */.  
2ede0 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20  gid_t *pGid     
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee00 2f 2a 20 4f 55 54 3a 20 67 69 64 20 6f 66 20 7a  /* OUT: gid of z
2ee10 46 69 6c 65 2e 20 2a 2f 0a 29 7b 0a 20 20 73 74  File. */.){.  st
2ee20 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee40 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28   Output of stat(
2ee50 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  ) on database fi
2ee60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  le */.  int rc =
2ee70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2ee80 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 46 69 6c  ( 0==osStat(zFil
2ee90 65 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  e, &sStat) ){.  
2eea0 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74    *pMode = sStat
2eeb0 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b  .st_mode & 0777;
2eec0 0a 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74  .    *pUid = sSt
2eed0 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 2a  at.st_uid;.    *
2eee0 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f  pGid = sStat.st_
2eef0 67 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  gid;.  }else{.  
2ef00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2ef10 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
2ef20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ef30 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ef40 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
2ef50 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65  unixOpen() to de
2ef60 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
2ef70 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
2ef80 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69  to create new fi
2ef90 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20  les with. If no 
2efa0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2efb0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
2efc0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
2efd0 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65  a value suitable
2efe0 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20   for passing as 
2eff0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
2f000 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73  nt to open(2) is
2f010 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
2f020 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20  pMode. If an IO 
2f030 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
2f040 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2f050 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
2f060 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2f070 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f   of *pMode is no
2f080 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  t modified..**.*
2f090 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c  * In most cases,
2f0a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
2f0b0 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20  ts *pMode to 0, 
2f0c0 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d  which will becom
2f0d0 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69  e.** an indicati
2f0e0 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65  on to robust_ope
2f0f0 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68  n() to create th
2f100 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20  e file using.** 
2f110 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2f120 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
2f130 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20  adjusted by the 
2f140 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66  umask..** But if
2f150 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2f160 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
2f170 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
2f180 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
2f190 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2f1a0 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
2f1b0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2f1c0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
2f1d0 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
2f1e0 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
2f1f0 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
2f200 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
2f210 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
2f220 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
2f230 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
2f240 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
2f250 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
2f260 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
2f270 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
2f280 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2f290 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
2f2a0 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
2f2b0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2f2c0 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
2f2d0 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
2f2e0 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
2f2f0 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
2f300 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
2f310 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
2f320 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
2f330 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
2f340 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
2f350 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
2f360 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
2f370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2f380 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2f390 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2f3a0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2f3b0 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2f3c0 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
2f3d0 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
2f3e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f400 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
2f410 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
2f420 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
2f430 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
2f440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f450 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
2f460 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
2f470 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69  ile with */.  ui
2f480 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20  d_t *pUid,      
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f4a0 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74   OUT: uid to set
2f4b0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2f4c0 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
2f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4e0 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f    /* OUT: gid to
2f4f0 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2f500 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2f510 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2f520 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2f530 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
2f540 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64  ode = 0;.  *pUid
2f550 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20   = 0;.  *pGid = 
2f560 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  0;.  if( flags &
2f570 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
2f580 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
2f590 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
2f5a0 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f     char zDb[MAX_
2f5b0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20  PATHNAME+1];    
2f5c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
2f5d0 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
2f5e0 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20  t nDb;          
2f5f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2f600 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62  umber of valid b
2f610 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 0a  ytes in zDb */..
2f620 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20      /* zPath is 
2f630 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20  a path to a WAL 
2f640 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  or journal file.
2f650 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2f660 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20  lock derives.   
2f670 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20   ** the path to 
2f680 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64  the associated d
2f690 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f  atabase file fro
2f6a0 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c  m zPath. This bl
2f6b0 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20  ock handles.    
2f6c0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
2f6d0 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69   naming conventi
2f6e0 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ons:.    **.    
2f6f0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2f700 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20  b>-journal".    
2f710 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2f720 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20  b>-wal".    **  
2f730 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
2f740 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  ournalNN".    **
2f750 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2f760 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20  -walNN".    **. 
2f770 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69     ** where NN i
2f780 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62  s a decimal numb
2f790 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e  er. The NN namin
2f7a0 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20  g schemes are . 
2f7b0 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68     ** used by th
2f7c0 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78  e test_multiplex
2f7d0 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a  .c module..    *
2f7e0 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69  /.    nDb = sqli
2f7f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2f800 68 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69  h) - 1; .    whi
2f810 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d  le( zPath[nDb]!=
2f820 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  '-' ){.      /* 
2f830 49 6e 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  In normal operat
2f840 69 6f 6e 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ion, the journal
2f850 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20   file name will 
2f860 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 0a 20  always contain. 
2f870 20 20 20 20 20 2a 2a 20 61 20 27 2d 27 20 63 68       ** a '-' ch
2f880 61 72 61 63 74 65 72 2e 20 20 48 6f 77 65 76 65  aracter.  Howeve
2f890 72 20 69 6e 20 38 2b 33 20 66 69 6c 65 6e 61 6d  r in 8+3 filenam
2f8a0 65 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20 61 20  e mode, or if a 
2f8b0 63 6f 72 72 75 70 74 0a 20 20 20 20 20 20 2a 2a  corrupt.      **
2f8c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2f8d0 6c 20 73 70 65 63 69 66 69 65 73 20 61 20 6d 61  l specifies a ma
2f8e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 77 69 74  ster journal wit
2f8f0 68 20 61 20 67 6f 6f 66 79 20 6e 61 6d 65 2c 20  h a goofy name, 
2f900 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  then.      ** th
2f910 65 20 27 2d 27 20 6d 69 67 68 74 20 62 65 20 6d  e '-' might be m
2f920 69 73 73 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  issing. */.     
2f930 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a   if( nDb==0 || z
2f940 50 61 74 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29  Path[nDb]=='.' )
2f950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f960 4b 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a  K;.      nDb--;.
2f970 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
2f980 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62  (zDb, zPath, nDb
2f990 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20  );.    zDb[nDb] 
2f9a0 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 72 63 20  = '\0';..    rc 
2f9b0 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 44  = getFileMode(zD
2f9c0 62 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20  b, pMode, pUid, 
2f9d0 70 47 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  pGid);.  }else i
2f9e0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
2f9f0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2fa00 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f  LOSE ){.    *pMo
2fa10 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c  de = 0600;.  }el
2fa20 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
2fa30 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29  QLITE_OPEN_URI )
2fa40 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
2fa50 20 69 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62   is a main datab
2fa60 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
2fa70 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
2fa80 20 75 73 69 6e 67 20 61 20 55 52 49 0a 20 20 20   using a URI.   
2fa90 20 2a 2a 20 66 69 6c 65 6e 61 6d 65 2c 20 63 68   ** filename, ch
2faa0 65 63 6b 20 66 6f 72 20 74 68 65 20 22 6d 6f 64  eck for the "mod
2fab0 65 6f 66 22 20 70 61 72 61 6d 65 74 65 72 2e 20  eof" parameter. 
2fac0 49 66 20 70 72 65 73 65 6e 74 2c 20 69 6e 74 65  If present, inte
2fad0 72 70 72 65 74 0a 20 20 20 20 2a 2a 20 69 74 73  rpret.    ** its
2fae0 20 76 61 6c 75 65 20 61 73 20 61 20 66 69 6c 65   value as a file
2faf0 6e 61 6d 65 20 61 6e 64 20 74 72 79 20 74 6f 20  name and try to 
2fb00 63 6f 70 79 20 74 68 65 20 6d 6f 64 65 2c 20 75  copy the mode, u
2fb10 69 64 20 61 6e 64 20 67 69 64 20 66 72 6f 6d 0a  id and gid from.
2fb20 20 20 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65      ** that file
2fb30 2e 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  .  */.    const 
2fb40 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
2fb50 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
2fb60 7a 50 61 74 68 2c 20 22 6d 6f 64 65 6f 66 22 29  zPath, "modeof")
2fb70 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
2fb80 20 20 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c       rc = getFil
2fb90 65 4d 6f 64 65 28 7a 2c 20 70 4d 6f 64 65 2c 20  eMode(z, pMode, 
2fba0 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 20  pUid, pGid);.   
2fbb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2fbc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
2fbd0 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68  n the file zPath
2fbe0 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75  ..** .** Previou
2fbf0 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20  sly, the SQLite 
2fc00 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68  OS layer used th
2fc10 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ree functions in
2fc20 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a   place of this.*
2fc30 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  * one:.**.**    
2fc40 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2fc50 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20  adWrite();.**   
2fc60 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2fc70 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20  eadOnly();.**   
2fc80 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45    sqlite3OsOpenE
2fc90 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a  xclusive();.**.*
2fca0 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f  * These calls co
2fcb0 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
2fcc0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
2fcd0 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a  ations of flags:
2fce0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57  .**.**     ReadW
2fcf0 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52  rite() ->     (R
2fd00 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2fd10 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e  E).**     ReadOn
2fd20 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45  ly()  ->     (RE
2fd30 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20  ADONLY) .**     
2fd40 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2fd50 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20  -> (READWRITE | 
2fd60 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49  CREATE | EXCLUSI
2fd70 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c  VE).**.** The ol
2fd80 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  d OpenExclusive(
2fd90 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f  ) accepted a boo
2fda0 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20  lean argument - 
2fdb0 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a  "delFlag". If.**
2fdc0 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20   true, the file 
2fdd0 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74  was configured t
2fde0 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
2fdf0 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
2fe00 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64  the.** file hand
2fe10 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63  le closed. To ac
2fe20 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65  hieve the same e
2fe30 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73  ffect using this
2fe40 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61   new .** interfa
2fe50 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45  ce, add the DELE
2fe60 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74  TEONCLOSE flag t
2fe70 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
2fe80 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20  d above for .** 
2fe90 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e  OpenExclusive().
2fea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2feb0 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  nixOpen(.  sqlit
2fec0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2fed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
2fee0 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  FS for which thi
2fef0 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d  s is the xOpen m
2ff00 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
2ff10 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2ff20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e          /* Pathn
2ff30 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2ff40 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  e opened */.  sq
2ff50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2ff60 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2ff70 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2ff80 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69  r to be filled i
2ff90 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  n */.  int flags
2ffa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ffb0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61      /* Input fla
2ffc0 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  gs to control th
2ffd0 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69  e opening */.  i
2ffe0 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30000 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75  utput flags retu
30010 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63  rned to SQLite c
30020 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ore */.){.  unix
30030 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46  File *p = (unixF
30040 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
30050 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  nt fd = -1;     
30060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30070 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
30080 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65   returned by ope
30090 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65  n() */.  int ope
300a0 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  nFlags = 0;     
300b0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
300c0 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
300d0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
300e0 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
300f0 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
30100 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
30110 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20  /.  int noLock; 
30120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30130 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
30140 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  it locking primi
30150 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tives */.  int r
30160 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
30180 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64  ction Return Cod
30190 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  e */.  int ctrlF
301a0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
301b0 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c        /* UNIXFIL
301c0 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20  E_* flags */..  
301d0 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
301e0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
301f0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
30200 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
30210 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
30220 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
30230 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
30240 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
30250 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
30260 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
30270 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
30280 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
30290 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
302a0 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
302b0 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
302c0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
302d0 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20  READWRITE);.#if 
302e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
302f0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
30300 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d  t isAutoProxy  =
30310 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
30320 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
30330 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
30340 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
30350 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
30360 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
30370 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
30380 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20  sInfo;.#endif.. 
30390 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
303a0 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e  a master or main
303b0 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  -file journal, t
303c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
303d0 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69  l open.  ** a fi
303e0 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le-descriptor on
303f0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
30400 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  oo. The first ti
30410 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20  me unixSync().  
30420 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ** is called the
30430 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
30440 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
30450 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64  be fsync()ed and
30460 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a   close()d..  */.
30470 20 20 69 6e 74 20 69 73 4e 65 77 4a 72 6e 6c 20    int isNewJrnl 
30480 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
30490 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
304a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
304b0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
304c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
304d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
304e0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
304f0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30500 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  WAL.  ));..  /* 
30510 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
30520 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
30530 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
30540 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
30550 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
30560 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
30570 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
30580 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
30590 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
305a0 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
305b0 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20  X_PATHNAME+2];. 
305c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
305d0 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
305e0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
305f0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
30600 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
30610 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
30620 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
30630 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
30640 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
30650 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
30660 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
30670 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
30680 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
30690 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
306a0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
306b0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
306c0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
306d0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
306e0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
306f0 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
30700 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
30710 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
30720 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
30730 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
30740 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
30750 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
30760 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
30770 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
30780 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
30790 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
307a0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
307b0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
307c0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
307d0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
307e0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
307f0 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
30800 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
30810 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
30820 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
30830 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
30840 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
30850 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
30860 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
30870 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
30880 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
30890 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
308a0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
308b0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
308c0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
308d0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
308e0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
308f0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
30900 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
30910 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
30920 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
30930 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
30940 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
30950 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
30960 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
30970 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
30980 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
30990 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
309a0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
309b0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
309c0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
309d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
309e0 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
309f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
30a00 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
30a10 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
30a20 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
30a30 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
30a40 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
30a50 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
30a60 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30a70 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
30a80 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
30a90 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
30aa0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
30ab0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30ac0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
30ad0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
30ae0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
30af0 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69 64   /* Detect a pid
30b00 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65   change and rese
30b10 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65  t the PRNG.  The
30b20 72 65 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  re is a race con
30b30 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65  dition.  ** here
30b40 20 73 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f   such that two o
30b50 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61  r more threads a
30b60 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  ll trying to ope
30b70 6e 20 64 61 74 61 62 61 73 65 73 20 61 74 0a 20  n databases at. 
30b80 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73   ** the same ins
30b90 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72  tant might all r
30ba0 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20  eset the PRNG.  
30bb0 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73  But multiple res
30bc0 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72  ets.  ** are har
30bd0 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mless..  */.  if
30be0 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21  ( randomnessPid!
30bf0 3d 6f 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a  =osGetpid(0) ){.
30c00 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69      randomnessPi
30c10 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b  d = osGetpid(0);
30c20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
30c30 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
30c40 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  }..  memset(p, 0
30c50 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
30c60 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  e));..  if( eTyp
30c70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
30c80 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e  AIN_DB ){.    Un
30c90 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
30ca0 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64  sed;.    pUnused
30cb0 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
30cc0 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  d(zName, flags);
30cd0 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64  .    if( pUnused
30ce0 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70   ){.      fd = p
30cf0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20  Unused->fd;.    
30d00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e  }else{.      pUn
30d10 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
30d20 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a  alloc64(sizeof(*
30d30 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20  pUnused));.     
30d40 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
30d50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30d60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
30d70 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
30d80 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f  .    p->pPreallo
30d90 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20 70 55  catedUnused = pU
30da0 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44  nused;..    /* D
30db0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
30dc0 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
30dd0 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
30de0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20  they are not.   
30df0 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
30e00 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
30e10 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
30e20 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
30e30 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
30e40 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
30e50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
30e60 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
30e70 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61  OPEN_URI) || zNa
30e80 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
30e90 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c  +1]==0 );..  }el
30ea0 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b  se if( !zName ){
30eb0 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
30ec0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70   is NULL, the up
30ed0 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71  per layer is req
30ee0 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66  uesting a temp f
30ef0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
30f00 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
30f10 69 73 4e 65 77 4a 72 6e 6c 29 3b 0a 20 20 20 20  isNewJrnl);.    
30f20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70  rc = unixGetTemp
30f30 6e 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61 74  name(pVfs->mxPat
30f40 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29  hname, zTmpname)
30f50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30f80 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54  }.    zName = zT
30f90 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20  mpname;..    /* 
30fa0 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72  Generated tempor
30fb0 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ary filenames ar
30fc0 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d  e always double-
30fd0 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a  zero terminated.
30fe0 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62      ** for use b
30ff0 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  y sqlite3_uri_pa
31000 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20  rameter(). */.  
31010 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b    assert( zName[
31020 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
31030 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
31040 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
31050 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67  alue of the flag
31060 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  s parameter pass
31070 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63  ed to POSIX func
31080 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29  tion.  ** open()
31090 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20  . These must be 
310a0 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20  calculated even 
310b0 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74  if open() is not
310c0 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a   called, as.  **
310d0 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f   they may be sto
310e0 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
310f0 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61  he file handle a
31100 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  nd used by the .
31110 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65    ** 'conch file
31120 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69  ' locking functi
31130 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a  ons later on.  *
31140 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  /.  if( isReadon
31150 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20  ly )  openFlags 
31160 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  |= O_RDONLY;.  i
31170 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
31180 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
31190 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
311a0 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c  eate )    openFl
311b0 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
311c0 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
311d0 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
311e0 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
311f0 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67  LOW);.  openFlag
31200 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
31210 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
31220 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
31230 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b  mode_t openMode;
31240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31250 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
31260 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68  create file with
31270 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69   */.    uid_t ui
31280 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
31290 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20        /* Userid 
312a0 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
312b0 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20      gid_t gid;  
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312d0 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72    /* Groupid for
312e0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
312f0 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
31300 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
31310 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
31320 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20  , &uid, &gid);. 
31330 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
31350 73 65 72 74 28 20 21 70 2d 3e 70 50 72 65 61 6c  sert( !p->pPreal
31360 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29 3b  locatedUnused );
31370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
31380 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
31390 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  N_WAL || eType==
313a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
313b0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20  _JOURNAL );.    
313c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
313d0 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75   }.    fd = robu
313e0 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
313f0 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
31400 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  de);.    OSTRACE
31410 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
31420 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
31430 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
31440 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
31450 69 73 45 78 63 6c 75 73 69 76 65 20 7c 7c 20 28  isExclusive || (
31460 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52  openFlags & O_CR
31470 45 41 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 69  EAT)!=0 );.    i
31480 66 28 20 66 64 3c 30 20 26 26 20 69 73 4e 65 77  f( fd<0 && isNew
31490 4a 72 6e 6c 20 26 26 20 6f 73 41 63 63 65 73 73  Jrnl && osAccess
314a0 28 7a 4e 61 6d 65 2c 20 46 5f 4f 4b 29 20 29 7b  (zName, F_OK) ){
314b0 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  .      /* Trying
314c0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6a 6f 75   to create a jou
314d0 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 72 65 20  rnal file where 
314e0 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 77 72  we don't have wr
314f0 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  ite .      ** pe
31500 72 6d 69 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  rmission on the 
31510 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
31520 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
31530 72 72 6f 72 28 53 51 4c 49 54 45 5f 52 45 41 44  rror(SQLITE_READ
31540 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 2c 20  ONLY_DIRECTORY, 
31550 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a  "open", zName);.
31560 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
31570 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
31580 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
31590 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
315a0 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
315b0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
315c0 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
315d0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
315e0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
315f0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
31600 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
31610 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
31620 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
31630 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
31640 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
31650 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
31660 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
31670 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
31680 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
31690 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
316a0 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
316b0 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72   1;.      fd = r
316c0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
316d0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
316e0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
316f0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
31700 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
31710 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
31720 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
31730 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
31740 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
31750 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  shed;.    }..   
31760 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
31770 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
31780 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72  s root and if cr
31790 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c  eating a new rol
317a0 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
317b0 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65  rnal or WAL file
317c0 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73  , set the owners
317d0 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  hip of the journ
317e0 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a  al or WAL to be.
317f0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
31800 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
31810 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
31820 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
31830 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
31840 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
31850 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
31860 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77       robustFchow
31870 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b  n(fd, uid, gid);
31880 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
31890 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20  ert( fd>=0 );.  
318a0 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
318b0 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20  .    *pOutFlags 
318c0 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
318d0 69 66 28 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63  if( p->pPrealloc
318e0 61 74 65 64 55 6e 75 73 65 64 20 29 7b 0a 20 20  atedUnused ){.  
318f0 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74    p->pPreallocat
31900 65 64 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66  edUnused->fd = f
31910 64 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c  d;.    p->pPreal
31920 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66  locatedUnused->f
31930 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
31940 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  }..  if( isDelet
31950 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  e ){.#if OS_VXWO
31960 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  RKS.    zPath = 
31970 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66  zName;.#elif def
31980 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49  ined(SQLITE_UNLI
31990 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a  NK_AFTER_CLOSE).
319a0 20 20 20 20 7a 50 61 74 68 20 3d 20 73 71 6c 69      zPath = sqli
319b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
319c0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
319d0 28 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20  ( zPath==0 ){.  
319e0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
319f0 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
31a00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
31a10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
31a20 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  T;.    }.#else. 
31a30 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d     osUnlink(zNam
31a40 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
31a50 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
31a60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
31a70 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
31a80 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
31a90 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
31aa0 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
31ab0 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
31ac0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
31ad0 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66  NG_STYLE.  if( f
31ae0 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e  statfs(fd, &fsIn
31af0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
31b00 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
31b10 70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  p, errno);.    r
31b20 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
31b30 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
31b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31b50 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
31b60 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72  }.  if (0 == str
31b70 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73  ncmp("msdos", fs
31b80 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
31b90 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75  e, 5)) {.    ((u
31ba0 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
31bb0 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  >fsFlags |= SQLI
31bc0 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
31bd0 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  DOS;.  }.  if (0
31be0 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66   == strncmp("exf
31bf0 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  at", fsInfo.f_fs
31c00 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
31c10 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
31c20 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
31c30 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
31c40 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
31c50 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
31c60 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20   up appropriate 
31c70 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69  ctrlFlags */.  i
31c80 66 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20  f( isDelete )   
31c90 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
31ca0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
31cb0 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28  LE_DELETE;.  if(
31cc0 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20   isReadonly )   
31cd0 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
31ce0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
31cf0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63  _RDONLY;.  noLoc
31d00 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54  k = eType!=SQLIT
31d10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a  E_OPEN_MAIN_DB;.
31d20 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20    if( noLock )  
31d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d40 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
31d50 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20  XFILE_NOLOCK;.  
31d60 69 66 28 20 69 73 4e 65 77 4a 72 6e 6c 20 29 20  if( isNewJrnl ) 
31d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
31d80 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
31d90 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69  ILE_DIRSYNC;.  i
31da0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
31db0 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72  E_OPEN_URI ) ctr
31dc0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
31dd0 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c  LE_URI;..#if SQL
31de0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
31df0 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c  NG_STYLE.#if SQL
31e00 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
31e10 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74  _LOCKING.  isAut
31e20 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64  oProxy = 1;.#end
31e30 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50  if.  if( isAutoP
31e40 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d  roxy && (zPath!=
31e50 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63  NULL) && (!noLoc
31e60 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  k) && pVfs->xOpe
31e70 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  n ){.    char *e
31e80 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76  nvforce = getenv
31e90 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  ("SQLITE_FORCE_P
31ea0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a  ROXY_LOCKING");.
31eb0 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79      int useProxy
31ec0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51   = 0;..    /* SQ
31ed0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
31ee0 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e  _LOCKING==1 mean
31ef0 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75  s force always u
31f00 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e  se proxy, 0 mean
31f10 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20  s .    ** never 
31f20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20  use proxy, NULL 
31f30 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20  means use proxy 
31f40 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69  for non-local fi
31f50 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  les only.  */.  
31f60 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d    if( envforce!=
31f70 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73  NULL ){.      us
31f80 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e  eProxy = atoi(en
31f90 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d  vforce)>0;.    }
31fa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50  else{.      useP
31fb0 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e  roxy = !(fsInfo.
31fc0 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41  f_flags&MNT_LOCA
31fd0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
31fe0 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20  ( useProxy ){.  
31ff0 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55      rc = fillInU
32000 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
32010 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
32020 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
32030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
32050 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
32060 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78  rmUnixFile((unix
32070 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
32080 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  uto:");.        
32090 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
320a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
320b0 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20  * Use unixClose 
320c0 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
320d0 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20  resources added 
320e0 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  in fillInUnixFil
320f0 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
32100 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68  and clear all th
32110 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65  e structure's re
32120 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69  ferences.  Speci
32130 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20  fically, .      
32140 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d      ** pFile->pM
32150 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e  ethods will be N
32160 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73  ULL so sqlite3Os
32170 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20  Close will be a 
32180 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20  no-op .         
32190 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
321a0 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a  ixClose(pFile);.
321b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
321c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
321d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
321e0 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
321f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
32200 66 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 7a  f.  .  assert( z
32210 50 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61 74 68  Path==0 || zPath
32220 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 20 20  [0]=='/' .      
32230 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
32240 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
32250 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
32260 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
32270 4a 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a 20 20  JOURNAL .  );.  
32280 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
32290 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
322a0 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
322b0 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69  Flags);..open_fi
322c0 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
322d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
322e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
322f0 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
32300 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
32310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
32320 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
32330 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
32340 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
32350 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
32360 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
32370 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
32380 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
32390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
323a0 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
323b0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
323c0 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
323d0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
323e0 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
323f0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
32400 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
32410 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
32420 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
32430 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
32440 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
32450 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
32460 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
32470 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
32480 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
32490 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
324a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
324b0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
324c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
324d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
324e0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
324f0 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  osUnlink(zPath)=
32500 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28  =(-1) ){.    if(
32510 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23   errno==ENOENT.#
32520 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
32530 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73        || osAcces
32540 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65  s(zPath,0)!=0.#e
32550 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
32560 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
32570 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
32580 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32590 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
325a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
325b0 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
325c0 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
325d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
325e0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
325f0 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
32600 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79  YNC.  if( (dirSy
32610 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20  nc & 1)!=0 ){.  
32620 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63    int fd;.    rc
32630 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
32640 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
32650 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
32670 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 66 64  f( full_fsync(fd
32680 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ,0,0) ){.       
32690 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
326a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
326b0 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e  DIR_FSYNC, "fsyn
326c0 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  c", zPath);.    
326d0 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74    }.      robust
326e0 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
326f0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
32700 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
32710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
32720 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72  TOPEN );.      r
32730 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32740 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
32750 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32760 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
32770 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61  xistence of or a
32780 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
32790 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
327a0 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
327b0 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
327c0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
327d0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
327e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
327f0 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
32800 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
32810 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
32820 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
32830 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
32840 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
32850 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
32860 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
32870 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
32880 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
32890 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
328a0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
328b0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
328c0 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
328d0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
328e0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
328f0 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
32900 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
32910 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
32920 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
32930 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
32940 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
32950 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
32960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
32970 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
32980 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
32990 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
329a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
329b0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
329c0 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
329d0 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
329e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
329f0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32a00 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
32a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
32a20 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
32a30 20 20 61 73 73 65 72 74 28 20 70 52 65 73 4f 75    assert( pResOu
32a40 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  t!=0 );..  /* Th
32a50 65 20 73 70 65 63 20 73 61 79 73 20 74 68 65 72  e spec says ther
32a60 65 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73  e are three poss
32a70 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20  ible values for 
32a80 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79  flags.  But only
32a90 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65  .  ** two of the
32aa0 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75  m are actually u
32ab0 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
32ac0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
32ad0 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20  CCESS_EXISTS || 
32ae0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
32af0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 29  CESS_READWRITE )
32b00 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  ;..  if( flags==
32b10 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
32b20 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75  ISTS ){.    stru
32b30 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
32b40 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d   *pResOut = (0==
32b50 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
32b60 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
32b70 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ze>0);.  }else{.
32b80 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f      *pResOut = o
32b90 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57  sAccess(zPath, W
32ba0 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20  _OK|R_OK)==0;.  
32bb0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
32bc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  E_OK;.}../*.**.*
32bd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6b 46  /.static int mkF
32be0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 63  ullPathname(.  c
32bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
32c00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
32c10 2a 20 49 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  * Input path */.
32c20 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20    char *zOut,   
32c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c40 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
32c50 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74  er */.  int nOut
32c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c70 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
32c80 61 74 65 64 20 73 69 7a 65 20 6f 66 20 62 75 66  ated size of buf
32c90 66 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20  fer zOut */.){. 
32ca0 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 73 71 6c   int nPath = sql
32cb0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
32cc0 74 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20  th);.  int iOff 
32cd0 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  = 0;.  if( zPath
32ce0 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]!='/' ){.    
32cf0 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
32d00 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20 29 7b  t, nOut-2)==0 ){
32d10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
32d20 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
32d30 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
32d40 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
32d50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66  );.    }.    iOf
32d60 66 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  f = sqlite3Strle
32d70 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a  n30(zOut);.    z
32d80 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f  Out[iOff++] = '/
32d90 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 4f  ';.  }.  if( (iO
32da0 66 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f 75 74  ff+nPath+1)>nOut
32db0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 69 74   ){.    /* SQLit
32dc0 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 78  e assumes that x
32dd0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 6e  FullPathname() n
32de0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20 74 68  ul-terminates th
32df0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 0a  e output buffer.
32e00 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 69      ** even if i
32e10 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  t returns an err
32e20 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f 75 74  or.  */.    zOut
32e30 5b 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b 0a 20  [iOff] = '\0';. 
32e40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32e50 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
32e60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
32e70 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f 66 66  printf(nOut-iOff
32e80 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 22  , &zOut[iOff], "
32e90 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72  %s", zPath);.  r
32ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
32ec0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
32ed0 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
32ee0 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
32ef0 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
32f00 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
32f10 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
32f20 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
32f30 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
32f40 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
32f50 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
32f60 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
32f70 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
32f80 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
32f90 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
32fa0 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
32fb0 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
32fc0 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
32fd0 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
32fe0 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
32ff0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
33000 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
33010 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
33020 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
33030 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
33040 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
33050 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
33060 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
33070 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
33080 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
33090 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
330a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
330c0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
330d0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
330e0 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
330f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
33100 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
33110 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41  .#if !defined(HA
33120 56 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c 7c 20  VE_READLINK) || 
33130 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 53  !defined(HAVE_LS
33140 54 41 54 29 0a 20 20 72 65 74 75 72 6e 20 6d 6b  TAT).  return mk
33150 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 50 61  FullPathname(zPa
33160 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b  th, zOut, nOut);
33170 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 20  .#else.  int rc 
33180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
33190 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
331a0 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20 20 20  nLink = 1;      
331b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
331c0 62 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69 63 20  ber of symbolic 
331d0 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64 20 73  links followed s
331e0 6f 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  o far */.  const
331f0 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 50 61   char *zIn = zPa
33200 74 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75  th;      /* Inpu
33210 74 20 70 61 74 68 20 66 6f 72 20 65 61 63 68 20  t path for each 
33220 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f  iteration of loo
33230 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65  p */.  char *zDe
33240 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
33250 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
33260 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
33270 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
33280 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
33290 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
332a0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
332b0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
332c0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
332d0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
332e0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
332f0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
33300 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
33310 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
33320 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
33330 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
33340 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
33350 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
33360 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
33370 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
33380 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
33390 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
333a0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
333b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
333c0 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a  ..  do {..    /*
333d0 20 43 61 6c 6c 20 73 74 61 74 28 29 20 6f 6e 20   Call stat() on 
333e0 70 61 74 68 20 7a 49 6e 2e 20 53 65 74 20 62 4c  path zIn. Set bL
333f0 69 6e 6b 20 74 6f 20 74 72 75 65 20 69 66 20 74  ink to true if t
33400 68 65 20 70 61 74 68 20 69 73 20 61 20 73 79 6d  he path is a sym
33410 62 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c 69 6e  bolic.    ** lin
33420 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  k, or false othe
33430 72 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69  rwise.  */.    i
33440 6e 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20  nt bLink = 0;.  
33450 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
33460 66 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c 73 74  f;.    if( osLst
33470 61 74 28 7a 49 6e 2c 20 26 62 75 66 29 21 3d 30  at(zIn, &buf)!=0
33480 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
33490 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno!=ENOENT ){. 
334a0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
334b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
334c0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
334d0 6c 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a 20 20  lstat", zIn);.  
334e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
334f0 0a 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d 20 53  .      bLink = S
33500 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f  _ISLNK(buf.st_mo
33510 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  de);.    }..    
33520 69 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20 20 20  if( bLink ){.   
33530 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29     if( zDel==0 )
33540 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 20 3d  {.        zDel =
33550 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
33560 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69  nOut);.        i
33570 66 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72 63 20  f( zDel==0 ) rc 
33580 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
33590 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
335a0 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c   if( ++nLink>SQL
335b0 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53  ITE_MAX_SYMLINKS
335c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
335d0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
335e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a  _BKPT;.      }..
335f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33610 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61     nByte = osRea
33620 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c  dlink(zIn, zDel,
33630 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20 20 20   nOut-1);.      
33640 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b    if( nByte<0 ){
33650 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33660 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
33670 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
33680 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a  T, "readlink", z
33690 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  In);.        }el
336a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
336b0 28 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27 20 29  ( zDel[0]!='/' )
336c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
336d0 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t n;.           
336e0 20 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74 65 33   for(n = sqlite3
336f0 53 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b 20 6e  Strlen30(zIn); n
33700 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d  >0 && zIn[n-1]!=
33710 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20  '/'; n--);.     
33720 20 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65         if( nByte
33730 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20 20 20  +n+1>nOut ){.   
33740 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
33750 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
33760 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
33770 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33780 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
33790 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e  zDel[n], zDel, n
337a0 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20  Byte+1);.       
337b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44         memcpy(zD
337c0 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20  el, zIn, n);.   
337d0 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
337e0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   += n;.         
337f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
33800 0a 20 20 20 20 20 20 20 20 20 20 7a 44 65 6c 5b  .          zDel[
33810 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20  nByte] = '\0';. 
33820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33830 0a 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20 7a 44  ..      zIn = zD
33840 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  el;.    }..    a
33850 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
33860 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75  E_OK || zIn!=zOu
33870 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27  t || zIn[0]=='/'
33880 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
33890 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 49 6e  SQLITE_OK && zIn
338a0 21 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  !=zOut ){.      
338b0 72 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74 68 6e  rc = mkFullPathn
338c0 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e  ame(zIn, zOut, n
338d0 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Out);.    }.    
338e0 69 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29 20 62  if( bLink==0 ) b
338f0 72 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20 3d 20  reak;.    zIn = 
33900 7a 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  zOut;.  }while( 
33910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
33920 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
33930 28 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zDel);.  return
33940 20 72 63 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a   rc;.#endif   /*
33950 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 20 26   HAVE_READLINK &
33960 26 20 48 41 56 45 5f 4c 53 54 41 54 20 2a 2f 0a  & HAVE_LSTAT */.
33970 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
33980 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
33990 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
339a0 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
339b0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
339c0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
339d0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
339e0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
339f0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
33a00 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
33a10 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
33a20 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
33a30 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
33a40 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
33a50 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
33a60 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
33a70 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
33a80 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
33a90 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
33aa0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
33ab0 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
33ac0 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
33ad0 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
33ae0 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
33af0 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
33b00 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
33b10 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
33b20 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
33b30 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
33b40 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
33b50 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
33b60 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
33b70 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
33b80 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
33b90 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
33ba0 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
33bb0 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
33bc0 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
33bd0 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
33be0 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
33bf0 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
33c00 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
33c10 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
33c20 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
33c30 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
33c40 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  ufOut){.  const 
33c50 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
33c60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33c70 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
33c80 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
33c90 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
33ca0 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
33cb0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
33cc0 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
33cd0 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
33ce0 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
33cf0 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
33d00 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
33d10 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
33d20 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
33d30 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
33d40 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
33d50 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
33d60 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
33d70 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
33d80 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
33d90 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
33da0 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
33db0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
33dc0 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
33dd0 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
33de0 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
33df0 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
33e00 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
33e10 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
33e20 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
33e30 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
33e40 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
33e50 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
33e60 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
33e70 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
33e80 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
33e90 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
33ea0 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
33eb0 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
33ec0 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
33ed0 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
33ee0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
33ef0 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
33f00 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
33f10 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
33f20 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
33f30 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
33f40 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
33f50 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
33f60 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
33f70 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
33f80 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
33f90 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
33fa0 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
33fb0 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
33fc0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
33fd0 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
33fe0 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
33ff0 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
34000 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
34010 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
34020 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
34030 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
34040 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
34050 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
34060 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
34070 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
34080 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
34090 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
340a0 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
340b0 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
340c0 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
340d0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
340e0 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
340f0 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
34100 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
34110 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
34120 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
34130 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
34140 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
34150 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
34160 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
34170 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34180 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
34190 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
341a0 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
341b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
341c0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
341d0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
341e0 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
341f0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
34200 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
34210 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
34220 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
34230 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
34240 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
34250 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
34260 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
34270 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
34280 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
34290 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
342a0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
342b0 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
342c0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
342d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
342e0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
342f0 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
34300 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
34310 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
34320 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
34330 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
34340 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
34350 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
34360 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
34370 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
34380 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
34390 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
343a0 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
343b0 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
343c0 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
343d0 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
343e0 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
343f0 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
34400 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
34410 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
34420 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
34430 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
34440 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
34450 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
34460 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
34470 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
34480 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
34490 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
344a0 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
344b0 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
344c0 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
344d0 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
344e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
344f0 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
34500 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
34510 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
34520 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
34530 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
34540 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
34550 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
34560 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
34570 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
34580 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
34590 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
345a0 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72  f, 0, nBuf);.  r
345b0 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f  andomnessPid = o
345c0 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69  sGetpid(0);  .#i
345d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
345e0 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
345f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
34600 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a  RANDOMNESS).  {.
34610 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b      int fd, got;
34620 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
34630 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
34640 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
34650 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
34660 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
34670 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
34680 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
34690 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
346a0 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  f(t));.      mem
346b0 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
346c0 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73  (t)], &randomnes
346d0 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e  sPid, sizeof(ran
346e0 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20  domnessPid));.  
346f0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
34700 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e  of(t)+sizeof(ran
34710 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69  domnessPid)<=(si
34720 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
34730 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
34740 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e  (t) + sizeof(ran
34750 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20  domnessPid);.   
34760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
34770 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
34780 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
34790 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
347a0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
347b0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
347c0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
347d0 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
347e0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
347f0 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
34800 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
34810 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
34820 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
34830 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
34840 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
34850 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
34860 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
34870 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
34880 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
34890 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
348a0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
348b0 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
348c0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
348d0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
348e0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
348f0 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
34900 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
34910 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
34920 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
34930 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
34940 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
34950 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
34960 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
34970 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
34980 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
34990 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
349a0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
349b0 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
349c0 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
349d0 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
349e0 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
349f0 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
34a00 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
34a10 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
34a20 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
34a30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34a40 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
34a50 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
34a60 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
34a70 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
34a80 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
34a90 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
34aa0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
34ab0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
34ac0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
34ad0 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
34ae0 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
34af0 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
34b00 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
34b10 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
34b20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
34b30 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
34b40 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
34b50 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
34b60 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
34b70 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
34b80 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
34b90 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
34ba0 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
34bb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
34bc0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
34bd0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
34be0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
34bf0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
34c00 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
34c10 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
34c20 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
34c30 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
34c40 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
34c50 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
34c60 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
34c70 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
34c80 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
34c90 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
34ca0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
34cb0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
34cc0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
34cd0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
34ce0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
34cf0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
34d00 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
34d10 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
34d20 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
34d30 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
34d40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
34d50 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
34d60 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
34d70 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
34d80 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
34d90 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
34da0 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
34db0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
34dc0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
34dd0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
34de0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
34df0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
34e00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
34e10 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
34e20 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
34e30 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
34e40 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
34e50 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
34e60 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
34e70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
34e80 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
34e90 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
34ea0 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
34eb0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
34ec0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
34ed0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
34ee0 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
34ef0 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
34f00 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
34f10 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
34f20 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
34f30 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
34f40 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
34f50 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
34f60 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
34f70 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
34f80 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
34f90 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
34fa0 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
34fb0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
34fc0 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
34fd0 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
34fe0 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
34ff0 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
35000 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67 65 74  Now;.  (void)get
35010 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
35020 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20   0);  /* Cannot 
35030 66 61 69 6c 20 67 69 76 65 6e 20 76 61 6c 69 64  fail given valid
35040 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
35050 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
35060 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
35070 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
35080 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
35090 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66  sec/1000;.#endif
350a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
350b0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
350c0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
350d0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
350e0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
350f0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
35100 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
35110 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
35120 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
35130 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
35140 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
35150 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35160 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
35170 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
35180 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
35190 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
351a0 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
351b0 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
351c0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
351d0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
351e0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
351f0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
35200 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
35210 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
35220 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
35230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35240 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
35250 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
35260 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
35270 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
35280 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69  int64 i = 0;.  i
35290 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f  nt rc;.  UNUSED_
352a0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
352b0 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43  d);.  rc = unixC
352c0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
352d0 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77  0, &i);.  *prNow
352e0 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
352f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35300 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
35310 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 20 30  nixCurrentTime 0
35320 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
35330 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  he xGetLastError
35340 28 29 20 6d 65 74 68 6f 64 20 69 73 20 64 65 73  () method is des
35350 69 67 6e 65 64 20 74 6f 20 72 65 74 75 72 6e 20  igned to return 
35360 61 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d  a better.** low-
35370 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73  level error mess
35380 61 67 65 20 77 68 65 6e 20 6f 70 65 72 61 74 69  age when operati
35390 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
353a0 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
353b0 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
353c0 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65  ation.  Only the
353d0 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   integer return 
353e0 63 6f 64 65 20 69 73 20 63 75 72 72 65 6e 74 6c  code is currentl
353f0 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 73 74  y.** used..*/.st
35400 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
35410 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
35420 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
35430 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68  int NotUsed2, ch
35440 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20  ar *NotUsed3){. 
35450 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
35460 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e  R(NotUsed);.  UN
35470 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
35480 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53  otUsed2);.  UNUS
35490 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
354a0 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e  Used3);.  return
354b0 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   errno;.}.../*.*
354c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
354d0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
354e0 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
354f0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
35500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
35510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
35560 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
35570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
355b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
355d0 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
355e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
35600 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
35610 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
35620 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
35630 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
35640 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
35650 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
35660 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
35670 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
35680 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
35690 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
356a0 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
356b0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
356c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
356d0 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
356e0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
356f0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
35700 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
35710 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
35720 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
35730 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
35740 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
35750 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
35760 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
35770 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
35780 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
35790 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
357a0 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
357b0 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
357c0 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
357d0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
357e0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
357f0 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
35800 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
35810 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
35820 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
35830 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
35840 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
35850 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
35860 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
35870 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
35880 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
35890 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
358a0 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
358b0 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
358c0 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
358d0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
358e0 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
358f0 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
35900 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
35910 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
35920 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
35930 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
35940 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
35950 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
35960 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
35970 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
35980 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
35990 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
359a0 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
359b0 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
359c0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
359d0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
359e0 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
359f0 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
35a00 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
35a10 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
35a20 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
35a30 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
35a40 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
35a50 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
35a60 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
35a70 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
35a80 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
35a90 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
35aa0 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
35ab0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
35ac0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
35ad0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
35ae0 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20  0x40000000.**   
35af0 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
35b00 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
35b10 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
35b20 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
35b30 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
35b40 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
35b50 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
35b60 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
35b70 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
35b80 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
35b90 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
35ba0 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
35bb0 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
35bc0 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
35bd0 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
35be0 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
35bf0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
35c00 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
35c10 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
35c20 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
35c30 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
35c40 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
35c50 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
35c60 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
35c70 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
35c80 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
35c90 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
35ca0 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
35cb0 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
35cc0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
35cd0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
35ce0 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
35cf0 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
35d00 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
35d10 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
35d20 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
35d30 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
35d40 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
35d50 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
35d60 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
35d70 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
35d80 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
35d90 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
35da0 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
35db0 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
35dc0 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
35dd0 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
35de0 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
35df0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
35e00 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
35e10 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
35e20 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
35e30 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
35e40 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
35e50 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
35e60 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
35e70 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
35e80 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
35e90 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
35ea0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
35eb0 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
35ec0 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
35ed0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
35ee0 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
35ef0 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
35f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
35f10 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
35f20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
35f30 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
35f40 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ame, SQLITE_FCNT
35f50 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
35f60 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
35f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
35f80 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
35f90 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
35fa0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
35fb0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
35fc0 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f  ITE_FCNTL_GET_LO
35fd0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
35fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ff0 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61        &<proxy_pa
36000 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53  th>);.**.**.** S
36010 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a  QL pragmas.**.**
36020 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
36030 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
36040 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e  ile=<proxy_path>
36050 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52   | :auto:.**  PR
36060 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
36070 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a  lock_proxy_file.
36080 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67  **.** Specifying
36090 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20   ":auto:" means 
360a0 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
360b0 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69   a conch file wi
360c0 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a  th a matching.**
360d0 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20   host ID in it, 
360e0 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69  the proxy path i
360f0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
36100 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f   will be used, o
36110 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72  therwise.** a pr
36120 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f  oxy path based o
36130 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d  n the user's tem
36140 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f  p dir.** (via co
36150 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
36160 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e  _USER_TEMP_DIR,.
36170 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65  ..)) will be use
36180 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74  d and the.** act
36190 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e  ual proxy file n
361a0 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ame is generated
361b0 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61   from the name a
361c0 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a  nd path of the.*
361d0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
361e0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
361f0 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64  *.**       For d
36200 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55  atabase path "/U
36210 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20  sers/me/foo.db" 
36220 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f  .**       The lo
36230 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
36240 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65  "<tmpdir>/sqlite
36250 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65  plocks/_Users_me
36260 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a  _foo.db:auto:").
36270 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63  **.** Once a loc
36280 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69  k proxy is confi
36290 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61  gured for a data
362a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  base connection,
362b0 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62   it can not.** b
362c0 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76  e removed, howev
362d0 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69  er it may be swi
362e0 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65  tched to a diffe
362f0 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20  rent proxy path 
36300 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65  via.** the above
36310 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20   APIs (assuming 
36320 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  the conch file i
36330 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64  s not being held
36340 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63   by another.** c
36350 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f  onnection or pro
36360 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  cess). .**.**.**
36370 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69   How proxy locki
36380 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d  ng works.** ----
36390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
363a0 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ---.**.** Proxy 
363b0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c  file locking rel
363c0 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e  ies primarily on
363d0 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74   two new support
363e0 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a  ing files: .**.*
363f0 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c  *   *  conch fil
36400 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73  e to limit acces
36410 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
36420 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67  e file to a sing
36430 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20  le host.**      
36440 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20  at a time.**.** 
36450 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20    *  proxy file 
36460 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78  to act as a prox
36470 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f  y for the adviso
36480 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c  ry locks normall
36490 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20  y.**      taken 
364a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
364b0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20  **.** The conch 
364c0 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20  file - to use a 
364d0 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69  proxy file, sqli
364e0 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68  te must first "h
364f0 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a  old the conch".*
36500 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73  * by taking an s
36510 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72  qlite-style shar
36520 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
36530 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69  onch file, readi
36540 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
36550 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67  ts and comparing
36560 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71   the host's uniq
36570 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20  ue host ID (see 
36580 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a  below) and lock.
36590 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67  ** proxy path ag
365a0 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73  ainst the values
365b0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
365c0 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68  onch.  The conch
365d0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72   file is.** stor
365e0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
365f0 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20  irectory as the 
36600 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
36610 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a  d the file name.
36620 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20  ** is patterned 
36630 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61  after the databa
36640 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  se file name as 
36650 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e  ".<databasename>
36660 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74  -conch"..** If t
36670 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f  he conch file do
36680 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  es not exist, or
36690 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f   its contents do
366a0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
366b0 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
366c0 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
366d0 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
366e0 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
366f0 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
36700 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
36710 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
36720 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
36730 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
36740 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
36750 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
36760 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
36770 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
36780 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
36790 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
367a0 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
367b0 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
367c0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
367d0 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
367e0 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
367f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
36800 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
36810 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
36820 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
36830 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
36840 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
36850 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
36860 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
36870 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
36880 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
36890 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
368a0 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
368b0 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
368c0 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
368d0 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
368e0 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
368f0 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
36900 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
36910 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
36920 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
36930 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
36940 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
36950 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
36960 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
36970 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
36980 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
36990 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
369a0 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
369b0 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
369c0 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
369d0 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
369e0 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
369f0 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
36a00 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
36a10 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
36a20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
36a30 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
36a40 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
36a50 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
36a60 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
36a70 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
36a80 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
36a90 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
36aa0 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
36ab0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
36ac0 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
36ad0 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
36ae0 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
36af0 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
36b00 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
36b10 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
36b20 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
36b30 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
36b40 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
36b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
36b60 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
36b70 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
36b80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
36b90 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
36ba0 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
36bb0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
36bc0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
36bd0 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
36be0 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
36bf0 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
36c00 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
36c10 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
36c20 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
36c30 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
36c40 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
36c50 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
36c60 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
36c70 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
36c80 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
36c90 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
36ca0 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
36cb0 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
36cc0 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
36cd0 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
36ce0 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
36cf0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
36d00 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
36d10 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
36d20 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
36d30 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
36d40 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
36d50 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
36d60 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
36d70 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
36d80 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
36d90 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
36da0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
36db0 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
36dc0 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
36dd0 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
36de0 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
36df0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
36e00 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
36e10 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
36e20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
36e30 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
36e40 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
36e50 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
36e60 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
36e70 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
36e80 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
36e90 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
36ea0 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
36eb0 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
36ec0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
36ed0 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
36ee0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
36ef0 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
36f00 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
36f10 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
36f20 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
36f30 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
36f40 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
36f50 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
36f60 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
36f70 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e  xplicitly callin
36f80 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  g the SQLITE_FCN
36f90 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
36fa0 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a  FILE pragma or.*
36fb0 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f  * sqlite_file_co
36fc0 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74  ntrol API is not
36fd0 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c   affected by SQL
36fe0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
36ff0 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a  LOCKING)..*/../*
37000 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
37010 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
37020 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a  ble on MacOSX .*
37030 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
37040 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
37050 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
37060 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54  G_STYLE../*.** T
37070 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  he proxyLockingC
37080 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70  ontext has the p
37090 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72  ath and file str
370a0 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20  uctures for the 
370b0 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c  remote .** and l
370c0 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73  ocal proxy files
370d0 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65   in it.*/.typede
370e0 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  f struct proxyLo
370f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f  ckingContext pro
37100 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37110 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  ;.struct proxyLo
37120 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
37130 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
37140 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  File;         /*
37150 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   Open conch file
37160 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
37170 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20  hFilePath;      
37180 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
37190 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
371a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
371b0 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f  Proxy;         /
371c0 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63  * Open proxy loc
371d0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
371e0 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b   *lockProxyPath;
371f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
37200 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
37210 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
37220 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
37230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
37240 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
37250 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63  le */.  int conc
37260 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  hHeld;          
37270 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65       /* 1 if the
37280 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20   conch is held, 
37290 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a  -1 if lockless *
372a0 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20  /.  int nFails; 
372b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
372d0 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75  nch taking failu
372e0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  res */.  void *o
372f0 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
37300 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
37310 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
37320 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
37330 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
37340 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
37350 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
37360 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
37370 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
37380 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
37390 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
373a0 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
373b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
373c0 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
373d0 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
373e0 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
373f0 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
37400 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
37410 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
37420 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
37430 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
37440 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37450 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
37460 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
37470 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
37480 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
37490 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
374a0 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
374b0 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
374c0 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
374d0 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
374e0 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
374f0 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
37500 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
37510 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
37520 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
37530 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
37540 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
37550 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
37560 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
37570 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
37580 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
37590 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
375a0 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
375b0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
375c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
375d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
375e0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
375f0 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
37600 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20  "sqliteplocks", 
37610 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d  maxLen);    .  }
37620 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20  .# else.  len = 
37630 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22  strlcpy(lPath, "
37640 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  /tmp/", maxLen);
37650 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
37660 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e  .  if( lPath[len
37670 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  -1]!='/' ){.    
37680 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
37690 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e  ath, "/", maxLen
376a0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74  );.  }.  .  /* t
376b0 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20  ransform the db 
376c0 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65  path to a unique
376d0 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20   cache name */. 
376e0 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74   dbLen = (int)st
376f0 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20  rlen(dbPath);.  
37700 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65  for( i=0; i<dbLe
37710 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28  n && (i+len+7)<(
37720 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29  int)maxLen; i++)
37730 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64  {.    char c = d
37740 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50  bPath[i];.    lP
37750 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d  ath[i+len] = (c=
37760 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d  ='/')?'_':c;.  }
37770 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d  .  lPath[i+len]=
37780 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28  '\0';.  strlcat(
37790 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c  lPath, ":auto:",
377a0 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52   maxLen);.  OSTR
377b0 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
377c0 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
377d0 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
377e0 20 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64   lPath, osGetpid
377f0 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (0)));.  return 
37800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
37810 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
37820 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
37830 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
37840 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
37850 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
37860 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
37870 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
37880 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
37890 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
378a0 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
378b0 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
378c0 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
378d0 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
378e0 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
378f0 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
37900 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
37910 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
37920 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
37930 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
37940 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
37950 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
37960 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
37970 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
37980 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
37990 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
379a0 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
379b0 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
379c0 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
379d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
379e0 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
379f0 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
37a00 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
37a10 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
37a20 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
37a30 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
37a40 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
37a50 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
37a60 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
37a70 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
37a80 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b          if( osMk
37a90 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
37aa0 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
37ab0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
37ac0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
37ad0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
37ae0 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
37af0 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
37b00 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
37b10 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
37b20 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
37b30 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
37b40 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
37b50 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
37b60 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
37b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b80 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
37b90 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
37ba0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
37bb0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
37bc0 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
37bd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
37be0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
37bf0 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
37c00 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
37c10 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
37c20 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
37c30 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
37c40 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
37c50 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73 47 65  n",lockPath,osGe
37c60 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74  tpid(0)));.  ret
37c70 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
37c80 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
37c90 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37ca0 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
37cb0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
37cc0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
37cd0 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
37ce0 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
37cf0 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
37d00 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
37d10 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
37d20 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
37d30 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
37d40 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
37d50 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
37d60 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
37d70 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
37d80 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
37d90 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
37da0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
37db0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
37dc0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
37dd0 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
37de0 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
37df0 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
37e00 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
37e10 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
37e20 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
37e30 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
37e40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
37e50 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
37e60 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
37e70 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
37e80 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
37e90 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
37ea0 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
37eb0 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
37ec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
37ed0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
37ee0 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
37ef0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
37f00 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
37f10 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
37f20 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
37f30 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
37f40 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
37f50 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
37f60 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
37f70 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
37f80 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
37f90 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
37fa0 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
37fb0 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
37fc0 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
37fd0 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
37fe0 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
37ff0 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
38000 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
38010 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
38020 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
38030 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
38040 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
38050 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
38060 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
38070 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
38080 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
38090 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
380a0 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
380b0 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
380c0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
380d0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a  te3_malloc64(siz
380e0 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
380f0 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
38100 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
38110 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
38120 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
38130 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
38140 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
38150 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
38160 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
38170 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
38180 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( fd<0 && errno=
38190 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63  =ENOENT && isloc
381a0 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  kfile ){.      i
381b0 66 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  f( proxyCreateLo
381c0 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20  ckPath(path) == 
381d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
381e0 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
381f0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
38200 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  Flags, 0);.     
38210 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
38220 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f  f( fd<0 ){.    o
38230 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
38240 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  NLY;.    fd = ro
38250 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
38260 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
38270 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
38280 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
38290 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
382a0 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
382b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
382c0 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
382d0 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
382e0 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
382f0 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
38300 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
38310 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
38320 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
38330 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
38340 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
38350 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
38360 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
38370 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
38380 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
38390 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
383a0 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
383b0 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
383c0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65  e3_malloc64(size
383d0 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
383e0 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
383f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
38400 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
38410 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f  goto end_create_
38420 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d  proxy;.  }.  mem
38430 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
38440 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
38450 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67    pNew->openFlag
38460 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
38470 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66   memset(&dummyVf
38480 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  s, 0, sizeof(dum
38490 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79  myVfs));.  dummy
384a0 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28  Vfs.pAppData = (
384b0 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
384c0 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79  oFinder;.  dummy
384d0 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d  Vfs.zName = "dum
384e0 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e  my";.  pUnused->
384f0 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73  fd = fd;.  pUnus
38500 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e  ed->flags = open
38510 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70  Flags;.  pNew->p
38520 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
38530 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
38540 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
38550