/ Hex Artifact Content
Login

Artifact 9922c8f5b2e32c0f0be2292feca5f72d88f6a833:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61  if../*.** standa
0c30: 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73  rd include files
0c40: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ..*/.#include <s
0c50: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
0c60: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
0c70: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
0c80: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  l.h>.#include <u
0c90: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0ca0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  e <time.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  .#include <errno
0cd0: 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .h>.#if !defined
0ce0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
0cf0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
0d00: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e  MMAP_SIZE>0.# in
0d10: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e  clude <sys/mman.
0d20: 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  h>.#endif..#if S
0d30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0d40: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 4f 53  KING_STYLE || OS
0d50: 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63 6c 75  _VXWORKS.# inclu
0d60: 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e  de <sys/ioctl.h>
0d70: 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  .# if OS_VXWORKS
0d80: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d  .#  include <sem
0d90: 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63  aphore.h>.#  inc
0da0: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0db0: 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64  # else.#  includ
0dc0: 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23  e <sys/file.h>.#
0dd0: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70    include <sys/p
0de0: 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a  aram.h>.# endif.
0df0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
0e00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0e10: 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65  STYLE */..#if de
0e20: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0e30: 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42   || (SQLITE_ENAB
0e40: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0e50: 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29   && !OS_VXWORKS)
0e60: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0e70: 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a  mount.h>.#endif.
0e80: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49  .#ifdef HAVE_UTI
0e90: 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74  ME.# include <ut
0ea0: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f  ime.h>.#endif../
0eb0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
0ec0: 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e  ues of unixFile.
0ed0: 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  fsFlags.*/.#defi
0ee0: 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  ne SQLITE_FSFLAG
0ef0: 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30  S_IS_MSDOS     0
0f00: 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  x1../*.** If we 
0f10: 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64  are to be thread
0f20: 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74  -safe, include t
0f30: 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64  he pthreads head
0f40: 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a  er and define.**
0f50: 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58   the SQLITE_UNIX
0f60: 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a  _THREADS macro..
0f70: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
0f80: 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75  READSAFE.# inclu
0f90: 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23  de <pthread.h>.#
0fa0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55   define SQLITE_U
0fb0: 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65  NIX_THREADS 1.#e
0fc0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  ndif../*.** Defa
0fd0: 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ult permissions 
0fe0: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
0ff0: 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e  new file.*/.#ifn
1000: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1010: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1020: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1030: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
1040: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34  _PERMISSIONS 064
1050: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  4.#endif../*.** 
1060: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1070: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1080: 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72  g auto proxy dir
1090: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
10a0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
10b0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
10c0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
10d0: 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
10e0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35  _PERMISSIONS 075
10f0: 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  5.#endif../*.** 
1100: 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  Maximum supporte
1110: 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a  d path-length..*
1120: 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  /.#define MAX_PA
1130: 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a  THNAME 512../*.*
1140: 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c  * Only set the l
1150: 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20  astErrno if the 
1160: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20  error code is a 
1170: 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e  real error and n
1180: 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20  ot .** a normal 
1190: 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20  expected return 
11a0: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42  code of SQLITE_B
11b0: 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  USY or SQLITE_OK
11c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c  .*/.#define IS_L
11d0: 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28  OCK_ERROR(x)  ((
11e0: 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20  x != SQLITE_OK) 
11f0: 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f  && (x != SQLITE_
1200: 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61  BUSY))../* Forwa
1210: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
1220: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1230: 75 6e 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b  unixShm unixShm;
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1250: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61  * Connection sha
1260: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red memory */.ty
1270: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1280: 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d  xShmNode unixShm
1290: 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  Node;       /* S
12a0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73  hared memory ins
12b0: 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66  tance */.typedef
12c0: 20 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64   struct unixInod
12d0: 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49  eInfo unixInodeI
12e0: 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e  nfo;   /* An i-n
12f0: 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ode */.typedef s
1300: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1310: 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b  Fd UnixUnusedFd;
1320: 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65       /* An unuse
1330: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1340: 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  r */../*.** Some
1350: 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66  times, after a f
1360: 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c  ile handle is cl
1370: 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20  osed by SQLite, 
1380: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1390: 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tor.** cannot be
13a0: 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74   closed immediat
13b0: 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61  ely. In these ca
13c0: 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f  ses, instances o
13d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
13e0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 72 65  ** structure are
13f0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
1400: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1410: 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67  or while waiting
1420: 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72   for an.** oppor
1430: 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72  tunity to either
1440: 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20   close or reuse 
1450: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e  it..*/.struct Un
1460: 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69  ixUnusedFd {.  i
1470: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
1480: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1490: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63   descriptor to c
14a0: 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  lose */.  int fl
14b0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
14c0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69      /* Flags thi
14d0: 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  s file descripto
14e0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74  r was opened wit
14f0: 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  h */.  UnixUnuse
1500: 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  dFd *pNext;     
1510: 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20   /* Next unused 
1520: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1530: 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a  on same file */.
1540: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e  };../*.** The un
1550: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
1560: 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20   is subclass of 
1570: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65  sqlite3_file spe
1580: 63 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69  cific to the uni
1590: 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65  x.** VFS impleme
15a0: 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70  ntations..*/.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
15c0: 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73  File unixFile;.s
15d0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b  truct unixFile {
15e0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
15f0: 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65  thods const *pMe
1600: 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73  thod;  /* Always
1610: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1620: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
1630: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
1640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1650: 20 56 46 53 20 74 68 61 74 20 63 72 65 61 74 65   VFS that create
1660: 64 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20  d this unixFile 
1670: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
1680: 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
1690: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
16a0: 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20   about locks on 
16b0: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
16c0: 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
16f0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
1700: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
1710: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
1720: 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20      /* The type 
1730: 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  of lock held on 
1740: 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73  this fd */.  uns
1750: 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20  igned short int 
1760: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
1770: 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62   /* Behavioral b
1780: 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a  its.  UNIXFILE_*
1790: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
17a0: 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e  /* The unix errn
17d0: 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20  o from last I/O 
17e0: 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20  error */.  void 
17f0: 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  *lockingContext;
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1810: 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  * Locking style 
1820: 73 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a  specific state *
1830: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
1840: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
1850: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61          /* Pre-a
1860: 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75  llocated UnixUnu
1870: 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  sedFd */.  const
1880: 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20   char *zPath;   
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
18b0: 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
18c0: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18e0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
18f0: 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ment information
1900: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e   */.  int szChun
1910: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1930: 66 69 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c  figured by FCNTL
1940: 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23  _CHUNK_SIZE */.#
1950: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1960: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20  AP_SIZE>0.  int 
1970: 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20  nFetchOut;      
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
19a0: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
19b0: 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  refs */.  sqlite
19c0: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
19d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19e0: 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
19f0: 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52  mapping at pMapR
1a00: 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  egion */.  sqlit
1a10: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a  e3_int64 mmapSiz
1a20: 65 41 63 74 75 61 6c 3b 20 20 20 20 20 20 20 2f  eActual;       /
1a30: 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  * Actual size of
1a40: 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70   mapping at pMap
1a50: 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  Region */.  sqli
1a60: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
1a70: 7a 65 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20  zeMax;          
1a80: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43  /* Configured FC
1a90: 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61  NTL_MMAP_SIZE va
1aa0: 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  lue */.  void *p
1ab0: 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  MapRegion;      
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65  Memory mapped re
1ae0: 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  gion */.#endif.#
1af0: 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1b00: 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a  .  int sectorSiz
1b10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b20: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
1b30: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   sector size */.
1b40: 20 20 69 6e 74 20 64 65 76 69 63 65 43 68 61 72    int deviceChar
1b50: 61 63 74 65 72 69 73 74 69 63 73 3b 20 20 20 20  acteristics;    
1b60: 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70        /* Precomp
1b70: 75 74 65 64 20 64 65 76 69 63 65 20 63 68 61 72  uted device char
1b80: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23  acteristics */.#
1b90: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1ba0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1bb0: 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e  STYLE.  int open
1bc0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1be0: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1bf0: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1c00: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1c10: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c20: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1c30: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1c40: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74     /* cached det
1c70: 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73  ails from statfs
1c80: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  () */.#endif.#if
1c90: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
1ca0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
1cb0: 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20  Id *pId;        
1cc0: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
1cd0: 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69   ID */.#endif.#i
1ce0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cf0: 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  G.  /* The next 
1d00: 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c  group of variabl
1d10: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  es are used to t
1d20: 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20  rack whether or 
1d30: 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  not the.  ** tra
1d40: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1d50: 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20   in bytes 24-27 
1d60: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
1d70: 73 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20  s are updated.  
1d80: 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20  ** whenever any 
1d90: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
1da0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
1db0: 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c  n assertion faul
1dc0: 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75  t will.  ** occu
1dd0: 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75  r if a file is u
1de0: 70 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  pdated without a
1df0: 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65  lso updating the
1e00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
1e10: 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  * counter.  This
1e20: 20 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f   test is made to
1e30: 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c   avoid new probl
1e40: 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  ems similar to t
1e50: 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63  he.  ** one desc
1e60: 72 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20  ribed by ticket 
1e70: 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75  #3584. .  */.  u
1e80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61  nsigned char tra
1e90: 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a  nsCntrChng;   /*
1ea0: 20 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61   True if the tra
1eb0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1ec0: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
1ed0: 73 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70  signed char dbUp
1ee0: 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  date;        /* 
1ef0: 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74  True if any part
1f00: 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
1f10: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
1f20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e  nsigned char inN
1f30: 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a  ormalWrite;   /*
1f40: 20 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f   True if in a no
1f50: 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61  rmal write opera
1f60: 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a  tion */..#endif.
1f70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1f80: 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74  EST.  /* In test
1f90: 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20   mode, increase 
1fa0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73  the size of this
1fb0: 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74   structure a bit
1fc0: 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69   so that .  ** i
1fd0: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
1fe0: 20 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73   the struct Cras
1ff0: 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e  hFile defined in
2000: 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20   test6.c..  */. 
2010: 20 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33   char aPadding[3
2020: 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f  2];.#endif.};../
2030: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
2040: 68 6f 6c 64 73 20 74 68 65 20 70 72 6f 63 65 73  holds the proces
2050: 73 20 69 64 20 28 70 69 64 29 20 66 72 6f 6d 20  s id (pid) from 
2060: 77 68 65 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d  when the xRandom
2070: 6e 65 73 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ness().** method
2080: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 20 49 66   was called.  If
2090: 20 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c   xOpen() is call
20a0: 65 64 20 66 72 6f 6d 20 61 20 64 69 66 66 65 72  ed from a differ
20b0: 65 6e 74 20 70 72 6f 63 65 73 73 20 69 64 2c 0a  ent process id,.
20c0: 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ** indicating th
20d0: 61 74 20 61 20 66 6f 72 6b 28 29 20 68 61 73 20  at a fork() has 
20e0: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 20 50 52  occurred, the PR
20f0: 4e 47 20 77 69 6c 6c 20 62 65 20 72 65 73 65 74  NG will be reset
2100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2110: 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
2120: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  0;../*.** Allowe
2130: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  d values for the
2140: 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c   unixFile.ctrlFl
2150: 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a  ags bitmask:.*/.
2160: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2170: 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30  _EXCL        0x0
2180: 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  1     /* Connect
2190: 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72  ions from one pr
21a0: 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64  ocess only */.#d
21b0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52  efine UNIXFILE_R
21c0: 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20  DONLY      0x02 
21d0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
21e0: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
21f0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2200: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30  LE_PERSIST_WAL 0
2210: 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69  x04     /* Persi
2220: 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a  stent WAL mode *
2230: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2240: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
2250: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
2260: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
2270: 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74  08     /* Direct
2280: 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20  ory sync needed 
2290: 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  */.#else.# defin
22a0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
22b0: 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69  NC    0x00.#endi
22c0: 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  f.#define UNIXFI
22d0: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30  LE_PSOW        0
22e0: 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  x10     /* SQLIT
22f0: 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
2300: 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23  E_OVERWRITE */.#
2310: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2320: 44 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30  DELETE      0x20
2330: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f       /* Delete o
2340: 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69  n close */.#defi
2350: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20  ne UNIXFILE_URI 
2360: 20 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20          0x40    
2370: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67   /* Filename mig
2380: 68 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61  ht have query pa
2390: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66  rameters */.#def
23a0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  ine UNIXFILE_NOL
23b0: 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20  OCK      0x80   
23c0: 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20    /* Do no file 
23d0: 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 23 64 65 66 69  locking */.#defi
23e0: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  ne UNIXFILE_WARN
23f0: 45 44 20 20 20 20 30 78 30 31 30 30 20 20 20 20  ED    0x0100    
2400: 20 2f 2a 20 76 65 72 69 66 79 44 62 46 69 6c 65   /* verifyDbFile
2410: 28 29 20 77 61 72 6e 69 6e 67 73 20 68 61 76 65  () warnings have
2420: 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
2430: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
2440: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
2450: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
2460: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
2470: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2480: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
2490: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
24a0: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
24b0: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
24c0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
24d0: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
24e0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
24f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2500: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
2510: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
2520: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
2530: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2540: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
2550: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
2560: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
2570: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2580: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
2590: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
25a0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
25b0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
25c0: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
25d0: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
25e0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
25f0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2600: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2610: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2620: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2630: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2640: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2650: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
2660: 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50  *.** HAVE_MREMAP
2670: 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75   defaults to tru
2680: 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66  e on Linux and f
2690: 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65 20  alse everywhere 
26a0: 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  else..*/.#if !de
26b0: 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41  fined(HAVE_MREMA
26c0: 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28  P).# if defined(
26d0: 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
26e0: 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43  fined(_GNU_SOURC
26f0: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  E).#  define HAV
2700: 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73  E_MREMAP 1.# els
2710: 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45  e.#  define HAVE
2720: 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69  _MREMAP 0.# endi
2730: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
2740: 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 20  Explicitly call 
2750: 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73 69  the 64-bit versi
2760: 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f 6e  on of lseek() on
2770: 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72 77   Android. Otherw
2780: 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a 20  ise, lseek().** 
2790: 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76 65  is the 32-bit ve
27a0: 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20 5f  rsion, even if _
27b0: 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53  FILE_OFFSET_BITS
27c0: 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  =64 is defined..
27d0: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52  */.#ifdef __ANDR
27e0: 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20 6c  OID__.# define l
27f0: 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65 6e  seek lseek64.#en
2800: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65  dif../*.** Diffe
2810: 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d  rent Unix system
2820: 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29  s declare open()
2830: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61   in different wa
2840: 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a  ys.  Same use.**
2850: 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72   open(const char
2860: 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20  *,int,mode_t).  
2870: 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28  Others use open(
2880: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2890: 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66  ...)..** The dif
28a0: 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72  ference is impor
28b0: 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20  tant when using 
28c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
28d0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
28e0: 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20   The safest way 
28f0: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  to deal with the
2900: 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61   problem is to a
2910: 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77  lways use this w
2920: 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20  rapper.** which 
2930: 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73  always has the s
2940: 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64  ame well-defined
2950: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
2960: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f  tatic int posixO
2970: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
2980: 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  zFile, int flags
2990: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72  , int mode){.  r
29a0: 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65  eturn open(zFile
29b0: 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a  , flags, mode);.
29c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65  }../*.** On some
29d0: 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20   systems, calls 
29e0: 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c  to fchown() will
29f0: 20 74 72 69 67 67 65 72 20 61 20 6d 65 73 73 61   trigger a messa
2a00: 67 65 20 69 6e 20 61 20 73 65 63 75 72 69 74 79  ge in a security
2a10: 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20  .** log if they 
2a20: 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f  come from non-ro
2a30: 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53  ot processes.  S
2a40: 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20  o avoid calling 
2a50: 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77  fchown() if.** w
2a60: 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e  e are not runnin
2a70: 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74  g as root..*/.st
2a80: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 46 63  atic int posixFc
2a90: 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64  hown(int fd, uid
2aa0: 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69  _t uid, gid_t gi
2ab0: 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d){.#if OS_VXWOR
2ac0: 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  KS.  return 0;.#
2ad0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 67 65  else.  return ge
2ae0: 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20 66 63  teuid() ? 0 : fc
2af0: 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29  hown(fd,uid,gid)
2b00: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 46  ;.#endif.}../* F
2b10: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
2b20: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2b30: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
2b40: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b  st char*, int*);
2b50: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2b60: 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64  Getpagesize(void
2b70: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  );../*.** Many s
2b80: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
2b90: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
2ba0: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
2bb0: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
2bc0: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
2bd0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
2be0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
2bf0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
2c00: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
2c10: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
2c20: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
2c30: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
2c40: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
2c50: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
2c60: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
2c70: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
2c80: 74 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f  tic struct unix_
2c90: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
2ca0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
2cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2cc0: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
2cd0: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
2ce0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43  3_syscall_ptr pC
2cf0: 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65  urrent; /* Curre
2d00: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
2d10: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
2d20: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2d30: 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f  _ptr pDefault; /
2d40: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
2d50: 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20  */.} aSyscall[] 
2d60: 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20  = {.  { "open", 
2d70: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2d80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
2d90: 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23  ixOpen,  0  },.#
2da0: 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20  define osOpen   
2db0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2dc0: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29  t char*,int,int)
2dd0: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
2de0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f  rrent)..  { "clo
2df0: 73 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  se",        (sql
2e00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2e10: 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20  )close,      0  
2e20: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f  },.#define osClo
2e30: 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  se     ((int(*)(
2e40: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d  int))aSyscall[1]
2e50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2e60: 22 61 63 63 65 73 73 22 2c 20 20 20 20 20 20 20  "access",       
2e70: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2e80: 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20 20 20  _ptr)access,    
2e90: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2ea0: 73 41 63 63 65 73 73 20 20 20 20 28 28 69 6e 74  sAccess    ((int
2eb0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
2ec0: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d  int))aSyscall[2]
2ed0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2ee0: 22 67 65 74 63 77 64 22 2c 20 20 20 20 20 20 20  "getcwd",       
2ef0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2f00: 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20 20 20  _ptr)getcwd,    
2f10: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2f20: 73 47 65 74 63 77 64 20 20 20 20 28 28 63 68 61  sGetcwd    ((cha
2f30: 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65  r*(*)(char*,size
2f40: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e  _t))aSyscall[3].
2f50: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2f60: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 28  stat",         (
2f70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2f80: 70 74 72 29 73 74 61 74 2c 20 20 20 20 20 20 20  ptr)stat,       
2f90: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2fa0: 53 74 61 74 20 20 20 20 20 20 28 28 69 6e 74 28  Stat      ((int(
2fb0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  *)(const char*,s
2fc0: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
2fd0: 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e  scall[4].pCurren
2fe0: 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a  t)../*.** The DJ
2ff0: 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76  GPP compiler env
3000: 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d  ironment looks m
3010: 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c  ostly like Unix,
3020: 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73   but it.** lacks
3030: 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   the fcntl() sys
3040: 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65  tem call.  So re
3050: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74  define fcntl() t
3060: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  o be something.*
3070: 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75  * that always su
3080: 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65  cceeds.  This me
3090: 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67  ans that locking
30a0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
30b0: 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20  under.** DJGPP. 
30c0: 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d   But it is DOS -
30d0: 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78   what did you ex
30e0: 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20  pect?.*/.#ifdef 
30f0: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66  __DJGPP__.  { "f
3100: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c  stat",        0,
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3130: 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20  sFstat(a,b,c)   
3140: 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20   0.#else     .  
3150: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
3160: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3170: 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20  ll_ptr)fstat,   
3180: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3190: 20 6f 73 46 73 74 61 74 20 20 20 20 20 28 28 69   osFstat     ((i
31a0: 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74  nt(*)(int,struct
31b0: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
31c0: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  [5].pCurrent).#e
31d0: 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e  ndif..  { "ftrun
31e0: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
31f0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3200: 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c  truncate,  0  },
3210: 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e  .#define osFtrun
3220: 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e  cate ((int(*)(in
3230: 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c  t,off_t))aSyscal
3240: 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[6].pCurrent)..
3250: 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20    { "fcntl",    
3260: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3270: 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20  call_ptr)fcntl, 
3280: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3290: 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28  ne osFcntl     (
32a0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c  (int(*)(int,int,
32b0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  ...))aSyscall[7]
32c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
32d0: 22 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 20  "read",         
32e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
32f0: 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20 20 20  _ptr)read,      
3300: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3310: 73 52 65 61 64 20 20 20 20 20 20 28 28 73 73 69  sRead      ((ssi
3320: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
3330: 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61  *,size_t))aSysca
3340: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
3350: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
3360: 5f 50 52 45 41 44 29 20 7c 7c 20 28 53 51 4c 49  _PREAD) || (SQLI
3370: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
3380: 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
3390: 58 57 4f 52 4b 53 29 0a 20 20 7b 20 22 70 72 65  XWORKS).  { "pre
33a0: 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ad",        (sql
33b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
33c0: 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20 20  )pread,      0  
33d0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
33e0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
33f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3400: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
3410: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
3420: 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20 28  ne osPread     (
3430: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3440: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
3450: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  _t))aSyscall[9].
3460: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3470: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3480: 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34  64).  { "pread64
3490: 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ",      (sqlite3
34a0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
34b0: 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23  ad64,    0  },.#
34c0: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36  else.  { "pread6
34d0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
34e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
34f0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3500: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3510: 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73 69  sPread64   ((ssi
3520: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
3530: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
3540: 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75  aSyscall[10].pCu
3550: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69  rrent)..  { "wri
3560: 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  te",        (sql
3570: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3580: 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20 20  )write,      0  
3590: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  },.#define osWri
35a0: 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  te     ((ssize_t
35b0: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
35c0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
35d0: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
35e0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
35f0: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 28 53  USE_PREAD) || (S
3600: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3610: 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
3620: 53 5f 56 58 57 4f 52 4b 53 29 0a 20 20 7b 20 22  S_VXWORKS).  { "
3630: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
3640: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3650: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
3660: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3670: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
3680: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3690: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
36a0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
36b0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
36c0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
36d0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
36e0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3710: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3720: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3730: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3740: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3750: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3760: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
3770: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3780: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3790: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
37a0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
37b0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
37c0: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
37d0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
37e0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
37f0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3800: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3810: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3820: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3830: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3840: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3850: 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  mod,     0  },.#
3860: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3870: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3880: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3890: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
38a0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
38b0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
38c0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
38d0: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
38e0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
38f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3900: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3910: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3920: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3930: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3940: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3950: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3960: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3970: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3980: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3990: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
39a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
39b0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
39c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
39d0: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
39e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
39f0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3a00: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3a10: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3a20: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3a30: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3a40: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3a50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3a60: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3a70: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3a80: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3a90: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3aa0: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3ab0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3ac0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3ad0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3ae0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3af0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3b00: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3b10: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3b20: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3b30: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3b40: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3b50: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3b60: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3b70: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3b80: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3b90: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3ba0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3bb0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3bc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3bd0: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3be0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3bf0: 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20  r)posixFchown,  
3c00: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3c10: 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e  osFchown    ((in
3c20: 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67  t(*)(int,uid_t,g
3c30: 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  id_t))aSyscall[2
3c40: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3c50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3c60: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
3c70: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
3c80: 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22  IZE>0.  { "mmap"
3c90: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3ca0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61  _syscall_ptr)mma
3cb0: 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  p,     0 },.#def
3cc0: 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69  ine osMmap ((voi
3cd0: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3ce0: 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f  _t,int,int,int,o
3cf0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ff_t))aSyscall[2
3d00: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
3d10: 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20  { "munmap",     
3d20: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3d30: 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20  ll_ptr)munmap,  
3d40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3d50: 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28  fine osMunmap ((
3d60: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
3d70: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3d80: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
3d90: 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
3da0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
3db0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3dc0: 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20  all_ptr)mremap, 
3dd0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3de0: 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22  lse.  { "mremap"
3df0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3e00: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3e20: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3e30: 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f 69  e osMremap ((voi
3e40: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3e50: 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e  _t,size_t,int,..
3e60: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  .))aSyscall[23].
3e70: 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20 22 67  pCurrent).  { "g
3e80: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
3e90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3ea0: 74 72 29 75 6e 69 78 47 65 74 70 61 67 65 73 69  tr)unixGetpagesi
3eb0: 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65  ze, 0 },.#define
3ec0: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
3ed0: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
3ee0: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
3ef0: 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b  ent)..#endif..};
3f00: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
3f10: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
3f20: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
3f30: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
3f40: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
3f50: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
3f60: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
3f70: 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56   the.** "unix" V
3f80: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
3f90: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
3fa0: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
3fb0: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
3fc0: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
3fd0: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
3fe0: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
3ff0: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
4000: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
4010: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
4020: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53  tic int unixSetS
4030: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4040: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4050: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
4060: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
4070: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
4080: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
4090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
40a0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
40b0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
40c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
40d0: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
40e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
40f0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
4100: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
4110: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
4120: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4130: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
4140: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4150: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
4160: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
4170: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
4180: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
4190: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
41a0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
41b0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
41c0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
41d0: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
41e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
41f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
4200: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
4210: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
4220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4230: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
4240: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
4250: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
4260: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
4270: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
4280: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4290: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
42a0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
42b0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
42c0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
42d0: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
42e0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
42f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4300: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
4310: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
4320: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4330: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
4340: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4350: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
4360: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
4370: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
4380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
4390: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
43a0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
43b0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
43c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
43d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
43e0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
43f0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
4400: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
4410: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
4420: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4430: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
4440: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4460: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4480: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
4490: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
44a0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
44b0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
44c0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
44d0: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
44e0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
44f0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
4500: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
4510: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
4520: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
4530: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69  _syscall_ptr uni
4540: 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xGetSystemCall(.
4550: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
4560: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
4570: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
4580: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
4590: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
45a0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
45b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
45c0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
45d0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
45e0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
45f0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4600: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4610: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
4620: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4630: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
4640: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
4650: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
4660: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
4670: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
4680: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
4690: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
46a0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
46b0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
46c0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
46d0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
46e0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
46f0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
4700: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
4710: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
4720: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
4730: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
4740: 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74  ar *unixNextSyst
4750: 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76  emCall(sqlite3_v
4760: 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  fs *p, const cha
4770: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4780: 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53   i = -1;..  UNUS
4790: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
47a0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
47b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
47c0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
47d0: 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l)-1; i++){.    
47e0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
47f0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4800: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
4810: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
4820: 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53  or(i++; i<ArrayS
4830: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69  ize(aSyscall); i
4840: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79  ++){.    if( aSy
4850: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4860: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  t!=0 ) return aS
4870: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b  yscall[i].zName;
4880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  .}../*.** Do not
48a0: 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65   accept any file
48b0: 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73   descriptor less
48c0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
48d0: 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  , in order to av
48e0: 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64  oid.** opening d
48f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69  atabase file usi
4900: 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ng file descript
4910: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ors that are com
4920: 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a  monly used for .
4930: 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  ** standard inpu
4940: 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65  t, output, and e
4950: 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rror..*/.#ifndef
4960: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
4970: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a  FILE_DESCRIPTOR.
4980: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
4990: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
49a0: 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66  CRIPTOR 3.#endif
49b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f  ../*.** Invoke o
49c0: 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75  pen().  Do so mu
49d0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e  ltiple times, un
49e0: 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75  til it either su
49f0: 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69  cceeds or.** fai
4a00: 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73  ls for some reas
4a10: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49  on other than EI
4a20: 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  NTR..**.** If th
4a30: 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
4a40: 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68  mode "m" is 0 th
4a50: 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65  en set it to the
4a60: 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20   default for.** 
4a70: 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66  SQLite.  The def
4a80: 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44  ault is SQLITE_D
4a90: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
4aa0: 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c  ISSIONS (normall
4ab0: 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f  y.** 0644) as mo
4ac0: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79  dified by the sy
4ad0: 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20  stem umask.  If 
4ae0: 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  m is not 0, then
4af0: 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c  .** make the fil
4b00: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
4b10: 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e  be exactly m ign
4b20: 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e  oring the umask.
4b30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72  .**.** The m par
4b40: 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e  ameter will be n
4b50: 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65  on-zero only whe
4b60: 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c  n creating -wal,
4b70: 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e   -journal,.** an
4b80: 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57  d -shm files.  W
4b90: 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c  e want those fil
4ba0: 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63  es to have *exac
4bb0: 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a  tly* the same.**
4bc0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20   permissions as 
4bd0: 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
4be0: 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74  atabase, unadult
4bf0: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d  erated by the um
4c00: 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  ask..** In that 
4c10: 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61  way, if a databa
4c20: 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72  se file is -rw-r
4c30: 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72  w-rw or -rw-rw-r
4c40: 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e  -, and a.** tran
4c50: 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20  saction crashes 
4c60: 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e  and leaves behin
4c70: 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20  d hot journals, 
4c80: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63  then any.** proc
4c90: 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65  ess that is able
4ca0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
4cb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61   database will a
4cc0: 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a  lso be able to.*
4cd0: 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f  * recover the ho
4ce0: 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73  t journals..*/.s
4cf0: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4d00: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
4d10: 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65   *z, int f, mode
4d20: 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b  _t m){.  int fd;
4d30: 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d  .  mode_t m2 = m
4d40: 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45   ? m : SQLITE_DE
4d50: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
4d60: 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28  SSIONS;.  while(
4d70: 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  1){.#if defined(
4d80: 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66  O_CLOEXEC).    f
4d90: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f  d = osOpen(z,f|O
4da0: 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65  _CLOEXEC,m2);.#e
4db0: 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f  lse.    fd = osO
4dc0: 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e  pen(z,f,m2);.#en
4dd0: 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30  dif.    if( fd<0
4de0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
4df0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e  rno==EINTR ) con
4e00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65  tinue;.      bre
4e10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
4e20: 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e  ( fd>=SQLITE_MIN
4e30: 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49  IMUM_FILE_DESCRI
4e40: 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20  PTOR ) break;.  
4e50: 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20    osClose(fd);. 
4e60: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
4e70: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a  QLITE_WARNING, .
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e  "attempt to open
4ea0: 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20   \"%s\" as file 
4eb0: 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20  descriptor %d", 
4ec0: 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d  z, fd);.    fd =
4ed0: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f   -1;.    if( osO
4ee0: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
4ef0: 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b   f, m)<0 ) break
4f00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d  ;.  }.  if( fd>=
4f10: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d  0 ){.    if( m!=
4f20: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
4f30: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a  t stat statbuf;.
4f40: 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
4f50: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d  t(fd, &statbuf)=
4f60: 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74  =0 .       && st
4f70: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
4f80: 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74  .       && (stat
4f90: 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  buf.st_mode&0777
4fa0: 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20  )!=m .      ){. 
4fb0: 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
4fc0: 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, m);.      }.
4fd0: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
4fe0: 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26  d(FD_CLOEXEC) &&
4ff0: 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f   (!defined(O_CLO
5000: 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58  EXEC) || O_CLOEX
5010: 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e  EC==0).    osFcn
5020: 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
5030: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
5040: 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
5050: 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
5060: 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d  }.  return fd;.}
5070: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
5080: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
5090: 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
50a0: 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
50b0: 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
50c0: 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
50d0: 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75  to protect the u
50e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64  nixInodeInfo and
50f0: 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  .** vxworksFileI
5100: 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  d objects used b
5110: 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  y this file, all
5120: 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
5130: 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d   .** shared by m
5140: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
5150: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
5160: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
5170: 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
5180: 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
5190: 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
51a0: 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
51b0: 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
51c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
51d0: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
51e0: 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
51f0: 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
5200: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
5210: 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
5220: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5230: 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74   );.**   unixEnt
5240: 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61  erLeave().*/.sta
5250: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74  tic void unixEnt
5260: 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
5270: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5280: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
5290: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
52a0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
52b0: 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
52c0: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
52d0: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
52e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
52f0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5300: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5310: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
5320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5330: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
5340: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f  unixMutexHeld(vo
5350: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
5360: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5370: 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
5380: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5390: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
53a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
53b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
53c0: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
53d0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
53e0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
53f0: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
5400: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
5410: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
5420: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
5430: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
5440: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
5450: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
5460: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
5470: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
5480: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5490: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
54a0: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
54b0: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
54c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
54d0: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
54e0: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
54f0: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
5500: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
5510: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
5520: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
5530: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
5540: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
5550: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
5560: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
5570: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
5580: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
5590: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
55a0: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
55b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
55c0: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
55d0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
55e0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
55f0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
5600: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
5610: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5620: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
5630: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
5640: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
5650: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
5660: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
5670: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
5680: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
5690: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
56a0: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
56b0: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
56c0: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
56d0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
56e0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
56f0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
5700: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
5710: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
5720: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
5730: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
5740: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
5750: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
5760: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
5770: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
5780: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
5790: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
57a0: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
57b0: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
57c0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
57d0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
57e0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
57f0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
5800: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
5810: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
5820: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
5830: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5840: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
5850: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
5860: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
5870: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5880: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5890: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
58a0: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
58b0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
58c0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
58d0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
58e0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
58f0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
5900: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
5910: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
5920: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
5930: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
5940: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
5950: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
5960: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
5970: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
5980: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
5990: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
59a0: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
59b0: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
59c0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
59d0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
59e0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
59f0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
5a00: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
5a10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
5a20: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
5a30: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
5a40: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
5a50: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5a60: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
5a70: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
5a80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5a90: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
5aa0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5ab0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
5ac0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
5ad0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5ae0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5af0: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
5b00: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5b10: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
5b20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5b30: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
5b40: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
5b50: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
5b60: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
5b70: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
5b80: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
5b90: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
5ba0: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
5bb0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
5bc0: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
5bd0: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
5be0: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
5bf0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
5c00: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
5c10: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
5c20: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
5c30: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a   due to EINTR.**
5c40: 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f  .** All calls to
5c50: 20 66 74 72 75 6e 63 61 74 65 28 29 20 77 69 74   ftruncate() wit
5c60: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68  hin this file sh
5c70: 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74 68 72  ould be made thr
5c80: 6f 75 67 68 20 74 68 69 73 20 77 72 61 70 70 65  ough this wrappe
5c90: 72 2e 0a 2a 2a 20 4f 6e 20 74 68 65 20 41 6e 64  r..** On the And
5ca0: 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62  roid platform, b
5cb0: 79 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f 67  ypassing the log
5cc0: 69 63 20 62 65 6c 6f 77 20 63 6f 75 6c 64 20 6c  ic below could l
5cd0: 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74  ead to a corrupt
5ce0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  .** database..*/
5cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
5d00: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
5d10: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
5d20: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
5d30: 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49  .#ifdef __ANDROI
5d40: 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72  D__.  /* On Andr
5d50: 6f 69 64 2c 20 66 74 72 75 6e 63 61 74 65 28 29  oid, ftruncate()
5d60: 20 61 6c 77 61 79 73 20 75 73 65 73 20 33 32 2d   always uses 32-
5d70: 62 69 74 20 6f 66 66 73 65 74 73 2c 20 65 76 65  bit offsets, eve
5d80: 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45  n if .  ** _FILE
5d90: 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20  _OFFSET_BITS=64 
5da0: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
5db0: 20 6d 65 61 6e 73 20 69 74 20 69 73 20 75 6e 73   means it is uns
5dc0: 61 66 65 20 74 6f 20 61 74 74 65 6d 70 74 20 74  afe to attempt t
5dd0: 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 20  o.  ** truncate 
5de0: 61 20 66 69 6c 65 20 74 6f 20 61 6e 79 20 73 69  a file to any si
5df0: 7a 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 32  ze larger than 2
5e00: 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67  GiB. Silently ig
5e10: 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75  nore any.  ** su
5e20: 63 68 20 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f  ch attempts.  */
5e30: 0a 20 20 69 66 28 20 73 7a 3e 28 73 71 6c 69 74  .  if( sz>(sqlit
5e40: 65 33 5f 69 6e 74 36 34 29 30 78 37 46 46 46 46  e3_int64)0x7FFFF
5e50: 46 46 46 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  FFF ){.    rc = 
5e60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
5e70: 73 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20  se.#endif.  do{ 
5e80: 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65  rc = osFtruncate
5e90: 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20  (h,sz); }while( 
5ea0: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
5eb0: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
5ec0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
5ed0: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
5ee0: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
5ef0: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
5f00: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
5f10: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
5f20: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
5f30: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
5f40: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
5f50: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
5f60: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
5f70: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
5f80: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
5f90: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
5fa0: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
5fb0: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
5fc0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
5fd0: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
5fe0: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
5ff0: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
6000: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
6010: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
6020: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
6030: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6040: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
6050: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
6060: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
6070: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
6080: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
6090: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
60a0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
60b0: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
60c0: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
60d0: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
60e0: 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f  ror) {.#if 0.  /
60f0: 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
6100: 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f 74  his code was not
6110: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
6120: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73 20  In theory, this 
6130: 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75  branch.  ** shou
6140: 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74 2c  ld never be hit,
6150: 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
6160: 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  n should only be
6170: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20 20   called after.  
6180: 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c  ** a locking-rel
6190: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28 69  ated function (i
61a0: 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61 73  .e. fcntl()) has
61b0: 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65   returned non-ze
61c0: 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ro with.  ** the
61d0: 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20   value of errno 
61e0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
61f0: 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20 73  ument. Since a s
6200: 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20 66  ystem call has f
6210: 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e  ailed,.  ** errn
6220: 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d  o should be non-
6230: 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
6240: 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69 66  Despite this, if
6250: 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73   errno really is
6260: 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20   zero, we still 
6270: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
6280: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
6290: 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d 20  _OK. The system 
62a0: 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64  call failed, and
62b0: 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65   *some* SQLite e
62c0: 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a 20  rror should be. 
62d0: 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20 62   ** propagated b
62e0: 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ack to the calle
62f0: 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68  r. Commenting th
6300: 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d 65  is branch out me
6310: 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a  ans errno==0.  *
6320: 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65  * will be handle
6330: 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75 6c  d by the "defaul
6340: 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a  t:" case below..
6350: 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a    */.  case 0: .
6360: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6370: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  E_OK;.#endif..  
6380: 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63  case EAGAIN:.  c
6390: 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20  ase ETIMEDOUT:. 
63a0: 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63   case EBUSY:.  c
63b0: 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73  ase EINTR:.  cas
63c0: 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20  e ENOLCK:  .    
63d0: 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65  /* random NFS re
63e0: 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73  try error, unles
63f0: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
6400: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
6410: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
6420: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
6430: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
6440: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20  hat it says */. 
6450: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6460: 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61  _BUSY;.    .  ca
6470: 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20  se EACCES: .    
6480: 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b  /* EACCES is lik
6490: 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20  e EAGAIN during 
64a0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
64b0: 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ns, but not any 
64c0: 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20  other time*/.   
64d0: 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72   if( (sqliteIOEr
64e0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
64f0: 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20  R_LOCK) || .    
6500: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
6510: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6520: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  _UNLOCK) || .   
6530: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6540: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6550: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20  R_RDLOCK) ||.   
6560: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6570: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6580: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
6590: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  OCK) ){.      re
65a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
65b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65  ;.    }.    /* e
65c0: 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  lse fall through
65d0: 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d   */.  case EPERM
65e0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
65f0: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a  LITE_PERM;.    .
6600: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
6610: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
6620: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
6630: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
6640: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
6650: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
6660: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6670: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
6680: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
6690: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
66a0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
66b0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
66c0: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
66d0: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
66e0: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
66f0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
6700: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
6710: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
6720: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
6730: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
6740: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
6750: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
6760: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
6770: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
6780: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
6790: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
67a0: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
67b0: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
67c0: 23 69 66 64 65 66 20 45 53 54 41 4c 45 20 20 20  #ifdef ESTALE   
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e    /* ESTALE is n
67f0: 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e  ot defined on In
6800: 74 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f  terix systems */
6810: 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a  .  case ESTALE:.
6820: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e  #endif.  case EN
6830: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
6840: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
6850: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
6860: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
6870: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
6880: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
6890: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
68a0: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  IOErr;.  }.}.../
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6910: 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46  * Begin Unique F
6920: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
6930: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
6940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6950: 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72  *.** On most ver
6960: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77  sions of unix, w
6970: 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71  e can get a uniq
6980: 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65  ue ID for a file
6990: 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e   by concatenatin
69a0: 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20  g.** the device 
69b0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
69c0: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75  node number.  Bu
69d0: 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  t this does not 
69e0: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
69f0: 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20  .** On VxWorks, 
6a00: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64  a unique file id
6a10: 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f   must be based o
6a20: 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  n the canonical 
6a30: 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  filename..**.** 
6a40: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  A pointer to an 
6a50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
6a60: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
6a70: 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ure can be used 
6a80: 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66  as a.** unique f
6a90: 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b  ile ID in VxWork
6aa0: 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63  s.  Each instanc
6ab0: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
6ac0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ure contains.** 
6ad0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
6ae0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6af0: 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f  .  There is also
6b00: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
6b10: 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72  nt.  .** The str
6b20: 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69  ucture is reclai
6b30: 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  med when the num
6b40: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6b50: 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a  to it drops to.*
6b60: 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  * zero..**.** Th
6b70: 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65  ere are never ve
6b80: 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70  ry many files op
6b90: 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61  en at one time a
6ba0: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e  nd lookups are n
6bb0: 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61  ot.** a performa
6bc0: 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74  nce-critical pat
6bd0: 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66  h, so it is suff
6be0: 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68  icient to put th
6bf0: 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ese.** structure
6c00: 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s on a linked li
6c10: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78  st..*/.struct vx
6c20: 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20  worksFileId {.  
6c30: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6c40: 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  leId *pNext;  /*
6c50: 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20   Next in a list 
6c60: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
6c70: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6c90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
6ca0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f  rences to this o
6cb0: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ne */.  int nNam
6cc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6cd0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6ce0: 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61  of the zCanonica
6cf0: 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a  lName[] string *
6d00: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e  /.  char *zCanon
6d10: 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  icalName;       
6d20: 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66    /* Canonical f
6d30: 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23  ilename */.};..#
6d40: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
6d50: 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20   .** All unique 
6d60: 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65  filenames are he
6d70: 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  ld on a linked l
6d80: 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68  ist headed by th
6d90: 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a  is.** variable:.
6da0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
6db0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
6dc0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
6dd0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70  = 0;../*.** Simp
6de0: 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20  lify a filename 
6df0: 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63  into its canonic
6e00: 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61  al form.** by ma
6e10: 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  king the followi
6e20: 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a  ng changes:.**.*
6e30: 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e  *  * removing an
6e40: 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64  y trailing and d
6e50: 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a  uplicate /.**  *
6e60: 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74   convert /./ int
6e70: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63  o just /.**  * c
6e80: 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68  onvert /A/../ wh
6e90: 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d  ere A is any sim
6ea0: 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75  ple name into ju
6eb0: 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  st /.**.** Chang
6ec0: 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70  es are made in-p
6ed0: 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68  lace.  Return th
6ee0: 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74  e new name lengt
6ef0: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  h..**.** The ori
6f00: 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
6f10: 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20  s in z[0..n-1]. 
6f20: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6f30: 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  er of.** charact
6f40: 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c  ers in the simpl
6f50: 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  ified name..*/.s
6f60: 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b  tatic int vxwork
6f70: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68  sSimplifyName(ch
6f80: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
6f90: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69   int i, j;.  whi
6fa0: 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31  le( n>1 && z[n-1
6fb0: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]=='/' ){ n--; }
6fc0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
6fd0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
6fe0: 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[i]=='/' ){.  
6ff0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
7000: 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
7010: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
7020: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
7030: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b  & z[i+2]=='/' ){
7040: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b  .        i += 1;
7050: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
7060: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
7070: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
7080: 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69   && i+3<n && z[i
7090: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b  +2]=='.' && z[i+
70a0: 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
70b0: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
70c0: 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20   z[j-1]!='/' ){ 
70d0: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
70e0: 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d  f( j>0 ){ j--; }
70f0: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b  .        i += 2;
7100: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
7110: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
7120: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b  .    z[j++] = z[
7130: 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d  i];.  }.  z[j] =
7140: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a   0;.  return j;.
7150: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
7160: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  unique file ID f
7170: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73  or the given abs
7180: 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20  olute pathname. 
7190: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
71a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f  nter to the vxwo
71b0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
71c0: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20  .  This pointer 
71d0: 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a  is the unique.**
71e0: 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20   file ID..**.** 
71f0: 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f  The nRef field o
7200: 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  f the vxworksFil
7210: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  eId object is in
7220: 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  cremented before
7230: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69  .** the object i
7240: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e  s returned.  A n
7250: 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ew vxworksFileId
7260: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
7270: 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20  ed.** and added 
7280: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69  to the global li
7290: 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  st if necessary.
72a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
72b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
72c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
72d0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
72e0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
72f0: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
7300: 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74  FindFileId(const
7310: 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65   char *zAbsolute
7320: 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Name){.  struct 
7330: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7340: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  New;         /* 
7350: 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e  search key and n
7360: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
7370: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7380: 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65  leId *pCandidate
7390: 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ;   /* For loopi
73a0: 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67  ng over existing
73b0: 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69   file IDs */.  i
73c0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
73f0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74  zAbsoluteName st
7400: 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ring */..  asser
7410: 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  t( zAbsoluteName
7420: 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20  [0]=='/' );.  n 
7430: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  = (int)strlen(zA
7440: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20  bsoluteName);.  
7450: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
7460: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
7470: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
7480: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7490: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
74a0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
74b0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
74c0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
74d0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
74e0: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
74f0: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
7500: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
7510: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
7520: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
7530: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
7540: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
7550: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
7560: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
7570: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
7580: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
7590: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
75a0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
75b0: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
75c0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
75d0: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
75e0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
75f0: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
7600: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
7610: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
7620: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
7630: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7640: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
7650: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
7660: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
7670: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7680: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7690: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
76a0: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
76b0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
76c0: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
76d0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
76e0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
76f0: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
7700: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
7710: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
7720: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
7730: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
7740: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7750: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
7760: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
7770: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
7780: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
7790: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
77a0: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
77b0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
77c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
77d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
77e0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
77f0: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
7800: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7810: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
7820: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
7830: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7840: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
7850: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
7860: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
7870: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
7880: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
7890: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
78a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
78b0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
78c0: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
78d0: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
78e0: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
78f0: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
7900: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
7910: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
7920: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
7930: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
7940: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
7950: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
7960: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
7970: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
7980: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
7990: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
79a0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
79b0: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
79c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
79d0: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
79e0: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
79f0: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
7a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
7a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
7ad0: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
7ae0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
7af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7b00: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
7b10: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
7b20: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
7b30: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
7b40: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
7b50: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
7b60: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
7b70: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
7b80: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
7b90: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
7ba0: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
7bb0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
7bc0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
7bd0: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
7be0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
7bf0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
7c00: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
7c10: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
7c20: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
7c30: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
7c40: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
7c50: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
7c60: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
7c70: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
7c80: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
7c90: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
7ca0: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
7cb0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
7cc0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
7cd0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
7ce0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
7cf0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
7d00: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
7d10: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
7d20: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
7d30: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
7d40: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
7d50: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
7d60: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
7d70: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
7d80: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
7d90: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
7da0: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
7db0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
7dc0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
7dd0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
7de0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
7df0: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
7e00: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
7e10: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
7e20: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
7e30: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
7e40: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
7e50: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
7e60: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
7e70: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
7e80: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
7e90: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
7ea0: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
7eb0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
7ec0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7ed0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
7ee0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
7ef0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
7f00: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
7f10: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
7f20: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
7f30: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
7f40: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
7f50: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
7f60: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
7f70: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
7f80: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
7f90: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
7fa0: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
7fb0: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
7fc0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
7fd0: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
7fe0: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
7ff0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
8000: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
8010: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
8020: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
8030: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
8040: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
8050: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
8060: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
8070: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
8080: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
8090: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
80a0: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
80b0: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
80c0: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
80d0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
80e0: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
80f0: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
8100: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8110: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
8120: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
8130: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
8140: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
8150: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
8160: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
8170: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
8180: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
8190: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
81a0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
81b0: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
81c0: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
81d0: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
81e0: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
81f0: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
8200: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
8210: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
8220: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
8230: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
8240: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
8250: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
8260: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
8270: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
8280: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
8290: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
82a0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
82b0: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
82c0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
82d0: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
82e0: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
82f0: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
8300: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
8310: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
8320: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
8330: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
8340: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
8350: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
8360: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
8370: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
8380: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
8390: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
83a0: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
83b0: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
83c0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
83d0: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
83e0: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
83f0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
8400: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
8410: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
8420: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
8430: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
8440: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
8450: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
8460: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
8470: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
8480: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
8490: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
84a0: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
84b0: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
84c0: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
84d0: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
84e0: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
84f0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
8500: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
8510: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
8520: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
8530: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
8540: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
8550: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
8560: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
8570: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
8580: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
8590: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
85a0: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
85b0: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
85c0: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
85d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
85e0: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
85f0: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
8600: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8610: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
8620: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
8630: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
8640: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
8650: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
8660: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
8670: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
8680: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
8690: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
86a0: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
86b0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
86c0: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
86d0: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
86e0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
86f0: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
8700: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
8710: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
8720: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
8730: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
8740: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
8750: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
8760: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
8770: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
8780: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8790: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
87a0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
87b0: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
87c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
87d0: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
87e0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
87f0: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
8800: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
8810: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
8820: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
8830: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
8840: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
8850: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
8860: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
8870: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
8880: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
8890: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
88a0: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
88b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
88c0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
88d0: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
88e0: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
88f0: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
8900: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
8910: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
8920: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
8930: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
8940: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
8950: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
8960: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
8970: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
8980: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
8990: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
89a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
89b0: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
89c0: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
89d0: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
89e0: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
89f0: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
8a00: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
8a10: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8a20: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
8a30: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
8a40: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
8a50: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
8a60: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
8a70: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
8a80: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
8a90: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
8aa0: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
8ab0: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
8ac0: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
8ad0: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
8ae0: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
8af0: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
8b00: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
8b10: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
8b20: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8b30: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
8b40: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
8b50: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
8b60: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
8b70: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
8b80: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
8b90: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
8ba0: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
8bb0: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
8bc0: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
8bd0: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
8be0: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
8bf0: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
8c00: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
8c10: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
8c20: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8c30: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
8c40: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
8c50: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
8c60: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
8c70: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
8c80: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
8c90: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
8ca0: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
8cb0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
8cc0: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
8cd0: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
8ce0: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
8cf0: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
8d00: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
8d10: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
8d20: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
8d30: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
8d40: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
8d50: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
8d60: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8d70: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
8d80: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
8d90: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
8da0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8db0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
8dc0: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
8dd0: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
8de0: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
8df0: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
8e00: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
8e10: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
8e20: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e40: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
8e50: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
8e60: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
8e70: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
8e80: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
8e90: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
8ea0: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
8eb0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
8ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
8ed0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
8ee0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
8ef0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8f00: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8f10: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
8f20: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
8f30: 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e  * inode.  Or, on
8f40: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74   LinuxThreads, t
8f50: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74  here is one of t
8f60: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
8f70: 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64  for.** each inod
8f80: 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68  e opened by each
8f90: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8fa0: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
8fb0: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
8fc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8fd0: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
8fe0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
8ff0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
9000: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
9010: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
9020: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
9030: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
9040: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
9050: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
9060: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
9070: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
9080: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
9090: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
90a0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
90b0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
90c0: 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20  nt nShared;     
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
90e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
90f0: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
9100: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9110: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
9120: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
9130: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
9140: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
9150: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9160: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20  bProcessLock;   
9170: 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76    /* An exclusiv
9180: 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69  e process lock i
9190: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
91a0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
91c0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
91d0: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
91e0: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
91f0: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
9200: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
9210: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
9220: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
9230: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  node */.  int nL
9240: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
9250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9260: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
9270: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f  ng file locks */
9280: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
9290: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
92a0: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
92b0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
92c0: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78   close */.  unix
92d0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74  InodeInfo *pNext
92e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
92f0: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  ist of all unixI
9300: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9310: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
9320: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
9330: 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e        /*    ....
9340: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
9350: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
9360: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
9370: 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  E.  unsigned lon
9380: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
9390: 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73  e;  /* for AFP s
93a0: 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20  imulated shared 
93b0: 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  lock */.#endif.#
93c0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
93d0: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
9400: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
9410: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
9420: 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a  PATHNAME+2];  /*
9430: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
9440: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
9450: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
9460: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
9470: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
9490: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
94a0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
94b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
94c0: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
94d0: 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76  _x(), is only ev
94e0: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
94f0: 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c  e macro.** unixL
9500: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
9510: 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   It is invoked a
9520: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
9530: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
9540: 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f  nction and errno
9550: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74   has been.** set
9560: 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  . It logs a mess
9570: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
9580: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
9590: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
95a0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f  alue of.** errno
95b0: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
95c0: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
95d0: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
95e0: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
95f0: 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f   or.** strerror_
9600: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  r()..**.** The f
9610: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
9620: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
9630: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
9640: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
9650: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
9660: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
9670: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
9680: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
9690: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
96a0: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
96b0: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
96c0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
96d0: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
96e0: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
96f0: 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c   (e.g. "unlink",
9700: 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65   "open") and the
9710: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
9720: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
9730: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
9740: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
9750: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
9760: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
9770: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
9780: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
9790: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
97a0: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
97d0: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
97e0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
97f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
9800: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
9810: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
9820: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9830: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
9840: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
9850: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
9860: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
9870: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
9880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
9890: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
98a0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
98b0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
98c0: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98e0: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
98f0: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
9900: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
9910: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
9920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
9930: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
9940: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
9950: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
9960: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
9970: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
9980: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
9990: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
99a0: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
99b0: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
99c0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
99d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
99e0: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
99f0: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
9a00: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
9a10: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
9a20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
9a30: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
9a40: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
9a50: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
9a60: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
9a70: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
9a80: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
9a90: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
9aa0: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
9ab0: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
9ac0: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
9ad0: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
9ae0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
9af0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
9b00: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
9b10: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
9b20: 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  that.  ** return
9b30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9b40: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
9b50: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
9b60: 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74  sage. That point
9b70: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69  er .  ** may poi
9b80: 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72  nt to aErr[], or
9b90: 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   it may point to
9ba0: 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f   some static sto
9bb0: 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20  rage somewhere. 
9bc0: 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
9bd0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
9be0: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
9bf0: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
9c00: 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65  on of .  ** stre
9c10: 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20  rror_r(), which 
9c20: 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e  always writes an
9c30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
9c40: 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a  nto aErr[]..  **
9c50: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64  .  ** If the cod
9c60: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73  e incorrectly as
9c70: 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
9c80: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
9c90: 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  on that is.  ** 
9ca0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65  available, the e
9cb0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
9cc0: 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d  l often be an em
9cd0: 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20  pty string. Not 
9ce0: 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62  a.  ** huge prob
9cf0: 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79  lem. Incorrectly
9d00: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74   concluding that
9d10: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
9d20: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20   is available . 
9d30: 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74   ** could lead t
9d40: 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f  o a segfault tho
9d50: 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  ugh..  */.#if de
9d60: 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52  fined(STRERROR_R
9d70: 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69  _CHAR_P) || defi
9d80: 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20  ned(__USE_GNU). 
9d90: 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66   zErr = .# endif
9da0: 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45  .  strerror_r(iE
9db0: 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65  rrno, aErr, size
9dc0: 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65  of(aErr)-1);..#e
9dd0: 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  lif SQLITE_THREA
9de0: 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20  DSAFE.  /* This 
9df0: 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20  is a threadsafe 
9e00: 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72  build, but strer
9e10: 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61  ror_r() is not a
9e20: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a  vailable. */.  z
9e30: 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  Err = "";.#else.
9e40: 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73    /* Non-threads
9e50: 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73  afe build, use s
9e60: 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20  trerror(). */.  
9e70: 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28  zErr = strerror(
9e80: 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a  iErrno);.#endif.
9e90: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
9ea0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
9eb0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
9ec0: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75  ode,.      "os_u
9ed0: 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  nix.c:%d: (%d) %
9ee0: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
9ef0: 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f     iLine, iErrno
9f00: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
9f10: 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zErr.  );..  ret
9f20: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
9f30: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
9f40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
9f50: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
9f60: 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f  hat close() almo
9f70: 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c  st always works,
9f80: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c   since it is onl
9f90: 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73  y in a.** very s
9fa0: 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ick application 
9fb0: 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63  or on a very sic
9fc0: 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20  k platform that 
9fd0: 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a  it might fail..*
9fe0: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69  * If it does fai
9ff0: 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74  l, simply leak t
a000: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
a010: 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74  or, but do log t
a020: 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  he.** error..**.
a030: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
a040: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72  is not safe to r
a050: 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74  etry close() aft
a060: 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74  er EINTR since t
a070: 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  he.** file descr
a080: 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65  iptor might have
a090: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
a0a0: 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20  used by another 
a0b0: 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65  thread..** So we
a0c0: 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20   don't even try 
a0d0: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
a0e0: 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20  an EINTR.  Just 
a0f0: 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  log the error.**
a100: 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f   and move on..*/
a110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62  .static void rob
a120: 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69  ust_close(unixFi
a130: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68  le *pFile, int h
a140: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
a150: 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20   if( osClose(h) 
a160: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  ){.    unixLogEr
a170: 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45  rorAtLine(SQLITE
a180: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63  _IOERR_CLOSE, "c
a190: 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20  lose",.         
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
a1b0: 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61  ile ? pFile->zPa
a1c0: 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b  th : 0, lineno);
a1d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
a1e0: 74 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73  t the pFile->las
a1f0: 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73  tErrno.  Do this
a200: 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65   in a subroutine
a210: 20 61 73 20 74 68 61 74 20 70 72 6f 76 69 64 65   as that provide
a220: 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 0a 2a  s a convenient.*
a230: 2a 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  * place to set a
a240: 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   breakpoint..*/.
a250: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72  static void stor
a260: 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69 78 46  eLastErrno(unixF
a270: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
a280: 65 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d  error){.  pFile-
a290: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a2a0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  or;.}../*.** Clo
a2b0: 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63  se all file desc
a2c0: 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74  riptors accumuat
a2d0: 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e  ed in the unixIn
a2e0: 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64  odeInfo->pUnused
a2f0: 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69   list..*/ .stati
a300: 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64  c void closePend
a310: 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20  ingFds(unixFile 
a320: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
a330: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a340: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
a350: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
a360: 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65   *p;.  UnixUnuse
a370: 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  dFd *pNext;.  fo
a380: 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  r(p=pInode->pUnu
a390: 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  sed; p; p=pNext)
a3a0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
a3b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75  >pNext;.    robu
a3c0: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
a3d0: 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p->fd, __LINE__)
a3e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
a3f0: 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e  ee(p);.  }.  pIn
a400: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30  ode->pUnused = 0
a410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
a420: 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e  se a unixInodeIn
a430: 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65  fo structure pre
a440: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
a450: 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d by findInodeIn
a460: 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fo()..**.** The 
a470: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
a480: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
a490: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
a4a0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
a4b0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
a4c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
a4d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a4e0: 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
a4f0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
a500: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
a510: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
a520: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
a530: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
a540: 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c  ld() );.  if( AL
a550: 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a  WAYS(pInode) ){.
a560: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
a570: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
a580: 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
a590: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a5a0: 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30  ode->pShmNode==0
a5b0: 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50   );.      closeP
a5c0: 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
a5d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
a5e0: 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  de->pPrev ){.   
a5f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a600: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
a610: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
a620: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72       pInode->pPr
a630: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f  ev->pNext = pIno
a640: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
a650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a660: 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73  assert( inodeLis
a670: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
a680: 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d       inodeList =
a690: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
a6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a6b0: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20  ( pInode->pNext 
a6c0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a6d0: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  t( pInode->pNext
a6e0: 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20  ->pPrev==pInode 
a6f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
a700: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  e->pNext->pPrev 
a710: 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b  = pInode->pPrev;
a720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a730: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f  qlite3_free(pIno
a740: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  de);.    }.  }.}
a750: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
a760: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
a770: 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78   locate the unix
a780: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
a790: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
a7a0: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
a7b0: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
a7c0: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
a7d0: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
a7e0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69   return value mi
a7f0: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
a800: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
a810: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
a820: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
a830: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
a840: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
a850: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
a860: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
a870: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a880: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
a890: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
a8a0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
a8b0: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f  atic int findIno
a8c0: 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69  deInfo(.  unixFi
a8d0: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
a8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
a8f0: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
a900: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
a910: 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e   key */.  unixIn
a920: 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64  odeInfo **ppInod
a930: 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  e        /* Retu
a940: 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  rn the unixInode
a950: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65  Info object here
a960: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
a990: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
a9a0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
a9d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
a9e0: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
a9f0: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
aa00: 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c  ileId;      /* L
aa10: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
aa20: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
aa30: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
aa40: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
aa50: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
aa60: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
aa70: 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  n */.  unixInode
aa80: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30  Info *pInode = 0
aa90: 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  ;     /* Candida
aaa0: 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  te unixInodeInfo
aab0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73   object */..  as
aac0: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
aad0: 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47  eld() );..  /* G
aae0: 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66  et low-level inf
aaf0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
ab00: 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20  he file that we 
ab10: 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a  can used to.  **
ab20: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
ab30: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69   name for the fi
ab40: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20  le..  */.  fd = 
ab50: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d  pFile->h;.  rc =
ab60: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
ab70: 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63  atbuf);.  if( rc
ab80: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65  !=0 ){.    store
ab90: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
aba0: 20 65 72 72 6e 6f 29 3b 0a 23 69 66 64 65 66 20   errno);.#ifdef 
abb0: 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66  EOVERFLOW.    if
abc0: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
abd0: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
abe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
abf0: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
ac00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ac10: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
ac20: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
ac30: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
ac40: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
ac50: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
ac60: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
ac70: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
ac80: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
ac90: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
aca0: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
acb0: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
acc0: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
acd0: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
ace0: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
acf0: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
ad00: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
ad10: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
ad20: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
ad30: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
ad40: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
ad50: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
ad60: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
ad70: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
ad80: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
ad90: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
ada0: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
adb0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
adc0: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
add0: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
ade0: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
adf0: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
ae00: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
ae10: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
ae20: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
ae30: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
ae40: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
ae50: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
ae60: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
ae70: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
ae80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
ae90: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
aea0: 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61  && (pFile->fsFla
aeb0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
aec0: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30  AGS_IS_MSDOS)!=0
aed0: 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d   ){.    do{ rc =
aee0: 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22   osWrite(fd, "S"
aef0: 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  , 1); }while( rc
af00: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
af10: 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  TR );.    if( rc
af20: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  !=1 ){.      sto
af30: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
af40: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
af50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
af60: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
af70: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
af80: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
af90: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
afa0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
afb0: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
afc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
afd0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
afe0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
aff0: 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20  memset(&fileId, 
b000: 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  0, sizeof(fileId
b010: 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76  ));.  fileId.dev
b020: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
b030: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
b040: 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d  S.  fileId.pId =
b050: 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c   pFile->pId;.#el
b060: 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20  se.  fileId.ino 
b070: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
b080: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64  ;.#endif.  pInod
b090: 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
b0a0: 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
b0b0: 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64  & memcmp(&fileId
b0c0: 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  , &pInode->fileI
b0d0: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
b0e0: 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  )) ){.    pInode
b0f0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
b100: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f  ;.  }.  if( pIno
b110: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  de==0 ){.    pIn
b120: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
b130: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49  lloc( sizeof(*pI
b140: 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28  node) );.    if(
b150: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
b160: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b170: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
b180: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
b190: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
b1a0: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
b1b0: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
b1c0: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
b1d0: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
b1e0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
b1f0: 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  1;.    pInode->p
b200: 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74  Next = inodeList
b210: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50  ;.    pInode->pP
b220: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
b230: 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f   inodeList ) ino
b240: 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  deList->pPrev = 
b250: 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64  pInode;.    inod
b260: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a  eList = pInode;.
b270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
b280: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ode->nRef++;.  }
b290: 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49  .  *ppInode = pI
b2a0: 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  node;.  return S
b2b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b2c0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
b2d0: 66 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e  f pFile has been
b2e0: 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69   renamed or unli
b2f0: 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61  nked since it wa
b300: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a  s first opened..
b310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
b320: 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46  leHasMoved(unixF
b330: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66  ile *pFile){.#if
b340: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65   OS_VXWORKS.  re
b350: 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  turn pFile->pIno
b360: 64 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e  de!=0 && pFile->
b370: 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  pId!=pFile->pIno
b380: 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a  de->fileId.pId;.
b390: 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73  #else.  struct s
b3a0: 74 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72  tat buf;.  retur
b3b0: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
b3c0: 3d 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53  =0 &&.      (osS
b3d0: 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  tat(pFile->zPath
b3e0: 2c 20 26 62 75 66 29 21 3d 30 20 7c 7c 20 62 75  , &buf)!=0 || bu
b3f0: 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d  f.st_ino!=pFile-
b400: 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  >pInode->fileId.
b410: 69 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ino);.#endif.}..
b420: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75  ./*.** Check a u
b430: 6e 69 78 46 69 6c 65 20 74 68 61 74 20 69 73 20  nixFile that is 
b440: 61 20 64 61 74 61 62 61 73 65 2e 20 20 56 65 72  a database.  Ver
b450: 69 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ify the followin
b460: 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65  g:.**.** (1) The
b470: 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
b480: 65 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74  e hard link on t
b490: 68 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54  he file.** (2) T
b4a0: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
b4b0: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a   symbolic link.*
b4c0: 2a 20 28 33 29 20 54 68 65 20 66 69 6c 65 20 68  * (3) The file h
b4d0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61  as not been rena
b4e0: 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a  med or unlinked.
b4f0: 2a 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69  **.** Issue sqli
b500: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b510: 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73  ARNING,...) mess
b520: 61 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67  ages if anything
b530: 20 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a   is not right..*
b540: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65  /.static void ve
b550: 72 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46  rifyDbFile(unixF
b560: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73  ile *pFile){.  s
b570: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
b580: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
b590: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
b5a0: 20 26 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e   & UNIXFILE_WARN
b5b0: 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  ED ){.    /* One
b5c0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
b5d0: 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 72 6e 69 6e  following warnin
b5e0: 67 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  gs have already 
b5f0: 62 65 65 6e 20 69 73 73 75 65 64 2e 20 20 44 6f  been issued.  Do
b600: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 72 65 70 65   not.    ** repe
b610: 61 74 20 74 68 65 6d 20 73 6f 20 61 73 20 6e 6f  at them so as no
b620: 74 20 74 6f 20 63 6c 75 74 74 65 72 20 74 68 65  t to clutter the
b630: 20 65 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20   error log */.  
b640: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b650: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69  rc = osFstat(pFi
b660: 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  le->h, &buf);.  
b670: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
b680: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b690: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61  ITE_WARNING, "ca
b6a0: 6e 6e 6f 74 20 66 73 74 61 74 20 64 62 20 66 69  nnot fstat db fi
b6b0: 6c 65 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  le %s", pFile->z
b6c0: 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65  Path);.    pFile
b6d0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
b6e0: 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a  NIXFILE_WARNED;.
b6f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b700: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
b710: 6e 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  nk==0 && (pFile-
b720: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
b730: 58 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30  XFILE_DELETE)==0
b740: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b750: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b760: 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b  NG, "file unlink
b770: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
b780: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
b790: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  );.    pFile->ct
b7a0: 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
b7b0: 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20  ILE_WARNED;.    
b7c0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
b7d0: 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31  ( buf.st_nlink>1
b7e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b7f0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b800: 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69  NG, "multiple li
b810: 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22  nks to file: %s"
b820: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b830: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
b840: 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
b850: 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65  E_WARNED;.    re
b860: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b870: 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69  fileHasMoved(pFi
b880: 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  le) ){.    sqlit
b890: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b8a0: 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e  RNING, "file ren
b8b0: 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  amed while open:
b8c0: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
b8d0: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
b8e0: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
b8f0: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
b900: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a    return;.  }.}.
b910: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b920: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
b930: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
b940: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
b950: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
b960: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
b970: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
b980: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
b990: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
b9a0: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
b9b0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
b9c0: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
b9d0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
b9e0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
b9f0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
ba00: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
ba10: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
ba20: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
ba30: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
ba40: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
ba50: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
ba60: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ba70: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
ba80: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
ba90: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
baa0: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
bab0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
bac0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
bad0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
bae0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
baf0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
bb00: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
bb10: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
bb20: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
bb30: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
bb40: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
bb50: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
bb60: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
bb70: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
bb80: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
bb90: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
bba0: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
bbb0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
bbc0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
bbd0: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
bbe0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
bbf0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
bc00: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
bc10: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
bc20: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
bc30: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
bc40: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
bc50: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
bc60: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
bc70: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
bc80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
bc90: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
bca0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
bcb0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
bcc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
bcd0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
bce0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
bcf0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
bd00: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
bd10: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
bd20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
bd30: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
bd40: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f  DLOCK;.      sto
bd50: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
bd60: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  e, errno);.    }
bd70: 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c   else if( lock.l
bd80: 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29  _type!=F_UNLCK )
bd90: 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  {.      reserved
bda0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
bdb0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78  #endif.  .  unix
bdc0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
bdd0: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
bde0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
bdf0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
be00: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
be10: 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
be20: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
be30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
be40: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
be50: 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20  t a system-lock 
be60: 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c  on the file pFil
be70: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
be80: 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 79  .** described by
be90: 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66   pLock..**.** If
bea0: 20 74 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f   the pFile was o
beb0: 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65  pened read/write
bec0: 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c   from unix-excl,
bed0: 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c   then the only l
bee0: 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61  ock.** ever obta
bef0: 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75  ined is an exclu
bf00: 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69  sive lock, and i
bf10: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78  t is obtained ex
bf20: 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68  actly once.** th
bf30: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79  e first time any
bf40: 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
bf50: 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75  ed.  All subsequ
bf60: 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69  ent system locki
bf70: 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73  ng.** operations
bf80: 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20   become no-ops. 
bf90: 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   Locking operati
bfa0: 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e  ons still happen
bfb0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20   internally,.** 
bfc0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72  in order to coor
bfd0: 64 69 6e 61 74 65 20 61 63 63 65 73 73 20 62 65  dinate access be
bfe0: 74 77 65 65 6e 20 73 65 70 61 72 61 74 65 20 64  tween separate d
bff0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c000: 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ons.** within th
c010: 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20  is process, but 
c020: 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68  all of that is h
c030: 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79  andled in memory
c040: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72   and the.** oper
c050: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65  ating system doe
c060: 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74  s not participat
c070: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
c080: 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73  nction is a pass
c090: 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74  -through to fcnt
c0a0: 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46  l(F_SETLK) if pF
c0b0: 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20  ile is using.** 
c0c0: 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74 68  any VFS other th
c0d0: 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f  an "unix-excl" o
c0e0: 72 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70  r if pFile is op
c0f0: 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78  ened on "unix-ex
c100: 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65  cl".** and is re
c110: 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a  ad-only..**.** Z
c120: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
c130: 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70  if the call comp
c140: 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c  letes successful
c150: 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63  ly, or -1 if a c
c160: 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28  all.** to fcntl(
c170: 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  ) fails. In this
c180: 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20   case, errno is 
c190: 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c  set appropriatel
c1a0: 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a  y (by fcntl())..
c1b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
c1c0: 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46  ixFileLock(unixF
c1d0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75  ile *pFile, stru
c1e0: 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29  ct flock *pLock)
c1f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
c200: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
c210: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
c220: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
c230: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
c240: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
c250: 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  de!=0 );.  if( (
c260: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
c270: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43  s & UNIXFILE_EXC
c280: 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d  L)!=0 || pInode-
c290: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20  >bProcessLock). 
c2a0: 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74    && ((pFile->ct
c2b0: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
c2c0: 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20  LE_RDONLY)==0). 
c2d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   ){.    if( pIno
c2e0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
c2f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
c300: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
c310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
c320: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
c330: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
c340: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
c350: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
c360: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
c370: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
c380: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
c390: 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  IZE;.      lock.
c3a0: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
c3b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46  ;.      rc = osF
c3c0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
c3d0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
c3e0: 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29        if( rc<0 )
c3f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c400: 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65    pInode->bProce
c410: 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  ssLock = 1;.    
c420: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
c430: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
c440: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
c450: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
c460: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
c470: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70  e->h, F_SETLK, p
c480: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Lock);.  }.  ret
c490: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c4a0: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
c4b0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
c4c0: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
c4d0: 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
c4e0: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
c4f0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
c500: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
c510: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
c520: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
c530: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
c540: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
c550: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
c560: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
c570: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
c580: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
c590: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
c5a0: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
c5b0: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
c5c0: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
c5d0: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
c5e0: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
c5f0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
c600: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
c610: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
c620: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
c630: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
c640: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
c650: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
c660: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
c670: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
c680: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
c690: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
c6a0: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
c6b0: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
c6c0: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
c6d0: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
c6e0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
c6f0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
c700: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
c710: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
c720: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
c730: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
c740: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c750: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c760: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
c770: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
c780: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
c790: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
c7a0: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
c7b0: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
c7c0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
c7d0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c7e0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
c7f0: 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  ck){.  /* The fo
c800: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
c810: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
c820: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
c830: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
c840: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
c850: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
c860: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
c870: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
c880: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
c890: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
c8a0: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
c8b0: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
c8c0: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
c8d0: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
c8e0: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
c8f0: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
c900: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
c910: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
c920: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
c930: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
c940: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
c950: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
c960: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
c970: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
c980: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
c990: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
c9a0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
c9b0: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
c9c0: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
c9d0: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
c9e0: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
c9f0: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
ca00: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
ca10: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
ca20: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
ca30: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
ca40: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
ca50: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
ca60: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
ca70: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
ca80: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
ca90: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
caa0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
cab0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
cac0: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
cad0: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
cae0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
caf0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
cb00: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
cb10: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
cb20: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
cb30: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
cb40: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
cb50: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
cb60: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
cb70: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
cb80: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
cb90: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
cba0: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
cbb0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
cbc0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
cbd0: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
cbe0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
cbf0: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
cc00: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
cc10: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
cc20: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
cc30: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
cc40: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
cc50: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
cc60: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
cc70: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
cc80: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
cc90: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
cca0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
ccb0: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
ccc0: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
ccd0: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
cce0: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
ccf0: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
cd00: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
cd10: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
cd20: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
cd30: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
cd40: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
cd50: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
cd60: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
cd70: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
cd80: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
cd90: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
cda0: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
cdb0: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
cdc0: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
cdd0: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
cde0: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
cdf0: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
ce00: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
ce10: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
ce20: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
ce30: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
ce40: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
ce50: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
ce60: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
ce70: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
ce80: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
ce90: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
cea0: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
ceb0: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
cec0: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
ced0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
cee0: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
cef0: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
cf00: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
cf10: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
cf20: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
cf30: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
cf40: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
cf50: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
cf60: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
cf70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
cf80: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
cf90: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
cfa0: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
cfb0: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
cfc0: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
cfd0: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
cfe0: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
cff0: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
d000: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
d010: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
d020: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
d030: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d040: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
d050: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
d060: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
d070: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
d080: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
d090: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74  ck lock;.  int t
d0a0: 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  Errno = 0;..  as
d0b0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
d0c0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
d0d0: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
d0e0: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %s,%d) pid=%d (u
d0f0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
d100: 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  h,.      azFileL
d110: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
d120: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
d130: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
d140: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
d150: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
d160: 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d  ileLock), pFile-
d170: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
d180: 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a   , getpid()));..
d190: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
d1a0: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
d1b0: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
d1c0: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
d1d0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
d1e0: 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
d1f0: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
d200: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
d210: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
d220: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
d230: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
d240: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
d250: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d260: 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
d270: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
d280: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
d290: 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
d2a0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
d2b0: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
d2c0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
d2d0: 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
d2e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d2f0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
d300: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
d310: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
d320: 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ct..  **  (1) We
d330: 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
d340: 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
d350: 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
d360: 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
d370: 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
d380: 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
d390: 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
d3a0: 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
d3b0: 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
d3c0: 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
d3d0: 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
d3e0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
d3f0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d400: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d410: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
d420: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d430: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
d440: 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
d450: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
d460: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
d470: 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
d480: 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
d490: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d4a0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
d4b0: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
d4c0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
d4d0: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
d4e0: 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
d4f0: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
d500: 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
d510: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
d520: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
d530: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
d540: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
d550: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
d560: 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
d570: 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
d580: 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
d590: 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
d5a0: 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
d5b0: 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
d5c0: 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
d5d0: 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
d5e0: 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
d5f0: 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
d600: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
d610: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
d620: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
d630: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
d640: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
d650: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41  }..  /* If a SHA
d660: 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
d670: 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
d680: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
d690: 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
d6a0: 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
d6b0: 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
d6c0: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
d6d0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
d6e0: 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
d6f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
d700: 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
d710: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
d720: 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65  & .      (pInode
d730: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
d740: 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
d750: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
d760: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
d770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
d780: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d790: 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
d7a0: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
d7b0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
d7c0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
d7d0: 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
d7e0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
d7f0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
d800: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
d810: 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
d820: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
d830: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
d840: 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49  }...  /* A PENDI
d850: 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
d860: 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
d870: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
d880: 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
d890: 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
d8a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
d8b0: 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
d8c0: 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
d8d0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
d8e0: 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  eased..  */.  lo
d8f0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
d900: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
d910: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28   SEEK_SET;.  if(
d920: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
d930: 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
d940: 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
d950: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
d960: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d970: 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
d980: 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   ){.    lock.l_t
d990: 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b  ype = (eFileLock
d9a0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f  ==SHARED_LOCK?F_
d9b0: 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a  RDLCK:F_WRLCK);.
d9c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d9d0: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
d9e0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
d9f0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
da00: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
da10: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
da20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
da30: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
da40: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
da50: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
da60: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
da70: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
da80: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
da90: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
daa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dab0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
dac0: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
dad0: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
dae0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
daf0: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
db00: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
db10: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
db20: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
db30: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
db40: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
db50: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
db60: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
db70: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
db80: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
db90: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
dba0: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
dbb0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
dbc0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
dbd0: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
dbe0: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
dbf0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
dc00: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
dc10: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
dc20: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69  ARED_SIZE;.    i
dc30: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
dc40: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
dc50: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
dc60: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
dc70: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
dc80: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
dc90: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
dca0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  _LOCK);.    }.. 
dcb0: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
dcc0: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
dcd0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
dce0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
dcf0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
dd00: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
dd10: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
dd20: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
dd30: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
dd40: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20  File, &lock) && 
dd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dd60: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
dd70: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
dd80: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
dd90: 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   */.      tErrno
dda0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ddb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
ddc0: 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d  R_UNLOCK; .    }
ddd0: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
dde0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ddf0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
de00: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
de10: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
de20: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
de30: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
de40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
de50: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
de60: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
de70: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
de80: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
de90: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
dea0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
deb0: 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
dec0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
ded0: 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
dee0: 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
def0: 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
df00: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
df10: 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
df20: 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
df30: 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
df40: 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
df50: 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
df60: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
df70: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
df80: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
df90: 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
dfa0: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
dfb0: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
dfc0: 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
dfd0: 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
dfe0: 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
dff0: 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
e000: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
e010: 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
e020: 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
e030: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
e040: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
e050: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20  = F_WRLCK;..    
e060: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
e070: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
e080: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45   || eFileLock==E
e090: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
e0a0: 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  .    if( eFileLo
e0b0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
e0c0: 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  K ){.      lock.
e0d0: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
e0e0: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c  ED_BYTE;.      l
e0f0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
e100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e110: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e120: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
e130: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
e140: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
e150: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69    }..    if( uni
e160: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
e170: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
e180: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
e190: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e1a0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
e1b0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
e1c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
e1d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
e1e0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
e1f0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
e200: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
e210: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
e220: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64    }.  }.  ..#ifd
e230: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
e240: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
e250: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
e260: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
e270: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
e280: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
e290: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
e2a0: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
e2b0: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
e2c0: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
e2d0: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
e2e0: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
e2f0: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
e300: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
e310: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
e320: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
e330: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
e340: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
e350: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
e360: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
e370: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
e380: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
e390: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
e3a0: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
e3b0: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
e3c0: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
e3d0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
e3e0: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
e3f0: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
e400: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
e410: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e420: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
e430: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e440: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
e450: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
e460: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
e470: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
e480: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
e490: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
e4a0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
e4b0: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
e4c0: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
e4d0: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
e4e0: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
e4f0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
e500: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
e510: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
e520: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
e530: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
e540: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
e550: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
e560: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
e570: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
e580: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
e590: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
e5a0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
e5b0: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
e5c0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
e5d0: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
e5e0: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
e5f0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
e600: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
e610: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
e620: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
e630: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
e640: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
e650: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
e660: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
e670: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
e680: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
e690: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
e6a0: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
e6b0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e6c0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
e6d0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
e6e0: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
e6f0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
e700: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
e710: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
e720: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
e730: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
e740: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
e750: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
e760: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
e770: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
e780: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
e790: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
e7a0: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
e7b0: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
e7c0: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
e7d0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
e7e0: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
e7f0: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
e800: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
e810: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
e820: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
e830: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
e840: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
e850: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
e860: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
e870: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
e880: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
e890: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
e8a0: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
e8b0: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
e8c0: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
e8d0: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
e8e0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
e8f0: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
e900: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
e910: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
e920: 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
e930: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e940: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
e950: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
e960: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
e970: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
e980: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
e990: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
e9a0: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
e9b0: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
e9c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
e9d0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
e9e0: 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
e9f0: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
ea00: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
ea10: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
ea20: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
ea30: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
ea40: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
ea50: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
ea60: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
ea70: 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67  nShared,.      g
ea80: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
ea90: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
eaa0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
eab0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
eac0: 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
ead0: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
eae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
eaf0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
eb00: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
eb10: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
eb20: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
eb30: 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
eb40: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
eb50: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
eb60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
eb70: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
eb80: 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
eb90: 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ck );..#ifdef SQ
eba0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
ebb0: 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
ebc0: 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
ebd0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
ebe0: 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
ebf0: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
ec00: 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
ec10: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
ec20: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
ec30: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
ec40: 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
ec50: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
ec60: 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
ec70: 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
ec80: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
ec90: 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
eca0: 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
ecb0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
ecc0: 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
ecd0: 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
ece0: 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
ecf0: 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
ed00: 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
ed10: 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
ed20: 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
ed30: 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
ed40: 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
ed50: 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
ed60: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
ed70: 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
ed80: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
ed90: 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
eda0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e  dif..    /* down
edb0: 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61  grading to a sha
edc0: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20  red lock on NFS 
edd0: 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e  involves clearin
ede0: 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  g the write lock
edf0: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65  .    ** before e
ee00: 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20  stablishing the 
ee10: 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76  readlock - to av
ee20: 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69  oid a race condi
ee30: 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64  tion we downgrad
ee40: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  e.    ** the loc
ee50: 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
ee60: 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
ee70: 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
ee80: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
ee90: 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b     ** write lock
eea0: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20   until the rest 
eeb0: 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  is covered by a 
eec0: 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a  read lock:.    *
eed0: 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a  *  1:   [WWWWW].
eee0: 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
eef0: 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20  ..W].    **  3: 
ef00: 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a    [RRRRW].    **
ef10: 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20    4:   [RRRR.]. 
ef20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46     */.    if( eF
ef30: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ef40: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  LOCK ){.      in
ef50: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
ef60: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
ef70: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
ef80: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
ef90: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
efa0: 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51  _APPLE__) || !SQ
efb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
efc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
efd0: 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55  (void)handleNFSU
efe0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73  nlock;.      ass
eff0: 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e  ert( handleNFSUn
f000: 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  lock==0 );.#endi
f010: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
f020: 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
f030: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
f040: 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66  G_STYLE.      if
f050: 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
f060: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66  k ){.        off
f070: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
f080: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
f090: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
f0a0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f0b0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
f0c0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
f0d0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
f0e0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
f0f0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
f100: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
f110: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
f120: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
f130: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
f140: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
f150: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f160: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f170: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
f180: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
f190: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f1a0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
f1b0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
f1c0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
f1d0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
f1e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
f1f0: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
f200: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f210: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f220: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
f230: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f240: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
f250: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f260: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
f270: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
f280: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
f290: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f2a0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f2b0: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
f2c0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
f2d0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
f2e0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
f2f0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
f300: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
f310: 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_RDLOCK);.   
f320: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
f330: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
f340: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
f350: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
f360: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
f370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f380: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f390: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f3a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f3b0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
f3c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
f3d0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
f3e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
f3f0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
f400: 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  +divSize;.      
f410: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f420: 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69  HARED_SIZE-divSi
f430: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
f440: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f450: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
f460: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
f470: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f480: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f490: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f4a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f4b0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
f4c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f4d0: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
f4e0: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
f4f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f500: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
f510: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
f520: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
f530: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
f540: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
f550: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f560: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
f570: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
f580: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
f590: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f5a0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f5b0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f5c0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f5d0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f5e0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f5f0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f600: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f610: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f620: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
f630: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
f640: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
f650: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
f660: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
f670: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
f680: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
f690: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
f6a0: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
f6b0: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
f6c0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
f6d0: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
f6e0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
f6f0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
f700: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
f710: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
f720: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
f730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
f740: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
f750: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
f760: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
f770: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
f780: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
f790: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
f7a0: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
f7b0: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
f7c0: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
f7d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f7e0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
f7f0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
f800: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
f810: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
f820: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f830: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f840: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
f850: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
f860: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
f870: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
f880: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
f890: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
f8a0: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
f8b0: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
f8c0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
f8d0: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
f8e0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
f8f0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f900: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
f910: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
f920: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
f930: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f940: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
f950: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
f960: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f970: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
f980: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
f990: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  unlock;.    }.  
f9a0: 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  }.  if( eFileLoc
f9b0: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k==NO_LOCK ){.  
f9c0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
f9d0: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
f9e0: 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
f9f0: 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
fa00: 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
fa10: 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
fa20: 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
fa30: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
fa40: 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
fa50: 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
fa60: 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
fa70: 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
fa80: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
fa90: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  d==0 ){.      lo
faa0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
fab0: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
fac0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
fad0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
fae0: 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
faf0: 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
fb00: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
fb10: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
fb20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
fb30: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
fb40: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
fb50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fb60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
fb70: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
fb80: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
fb90: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
fba0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
fbb0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
fbc0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
fbd0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
fbe0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
fbf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
fc00: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
fc10: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
fc20: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
fc30: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
fc40: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
fc50: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
fc60: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
fc70: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
fc80: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
fc90: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
fca0: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
fcb0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
fcc0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
fcd0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
fce0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
fcf0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
fd00: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
fd10: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
fd20: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
fd30: 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c    }.  }..end_unl
fd40: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
fd50: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
fd60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
fd70: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
fd80: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
fd90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fda0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
fdb0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
fdc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
fdd0: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
fde0: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
fdf0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
fe00: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
fe10: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
fe20: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fe30: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
fe40: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
fe50: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
fe60: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
fe70: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
fe80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fe90: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
fea0: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
feb0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
fec0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
fed0: 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  k){.#if SQLITE_M
fee0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
fef0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
ff00: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ff10: 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29  || ((unixFile *)
ff20: 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  id)->nFetchOut==
ff30: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  0 );.#endif.  re
ff40: 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
ff50: 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
ff60: 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  0);.}..#if SQLIT
ff70: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
ff80: 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  0.static int uni
ff90: 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
ffa0: 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74  e *pFd, i64 nByt
ffb0: 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
ffc0: 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
ffd0: 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65  ixFile *pFd);.#e
ffe0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
fff0: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
10000 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
10010 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
10020 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
10030 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
10040 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
10050 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
10060 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
10070 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
10080 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
10090 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
100a0 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
100b0 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
100c0 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
100d0 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
100e0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
100f0 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
10100 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
10110 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
10120 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
10130 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
10140 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
10150 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
10160 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
10170 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10180 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
10190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
101a0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
101b0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
101c0 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  )id;.#if SQLITE_
101d0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
101e0 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
101f0 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pFile);.#endif. 
10200 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
10210 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63   ){.    robust_c
10220 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
10230 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
10240 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
10250 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56  -1;.  }.#if OS_V
10260 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69  XWORKS.  if( pFi
10270 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69  le->pId ){.    i
10280 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
10290 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
102a0 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f  ELETE ){.      o
102b0 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70  sUnlink(pFile->p
102c0 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
102d0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  me);.    }.    v
102e0 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
102f0 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
10300 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20  .    pFile->pId 
10310 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
10320 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
10330 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
10340 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74  .  if( pFile->ct
10350 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
10360 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
10370 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d   osUnlink(pFile-
10380 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  >zPath);.    sql
10390 69 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72  ite3_free(*(char
103a0 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68  **)&pFile->zPath
103b0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50  );.    pFile->zP
103c0 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ath = 0;.  }.#en
103d0 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
103e0 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
103f0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
10400 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
10410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10420 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
10430 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
10440 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
10450 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
10460 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10470 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
10480 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
10490 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
104a0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
104b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
104c0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
104d0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
104e0 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62  *)id;.  verifyDb
104f0 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75  File(pFile);.  u
10500 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
10510 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
10520 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
10530 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
10540 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
10550 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
10560 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
10570 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
10580 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
10590 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
105a0 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
105b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
105c0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
105d0 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
105e0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
105f0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
10600 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
10610 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
10620 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
10630 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
10640 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
10650 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
10660 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
10670 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
10680 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
10690 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
106a0 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
106b0 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
106c0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
106d0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
106e0 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
106f0 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
10700 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
10710 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
10720 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
10730 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
10740 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
10750 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
10760 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
10770 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
10780 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
10790 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
107a0 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
107b0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
107c0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
107d0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
107e0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
107f0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
10800 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10850 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
10860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
108b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108c0 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
108d0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
10900 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
10910 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
10920 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
10930 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
10940 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
10950 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
10960 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
10970 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
10980 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
10990 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
109a0 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
109b0 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
109c0 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
109d0 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
109e0 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
109f0 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
10a00 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
10a10 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
10a20 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
10a30 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
10a40 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
10a50 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
10a60 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
10a70 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
10a80 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
10a90 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
10aa0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10ab0 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
10ac0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10ad0 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
10ae0 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
10af0 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
10b00 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
10b10 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
10b20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
10b30 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
10b40 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
10b50 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10b60 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
10b70 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
10b80 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
10b90 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
10ba0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
10bb0 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
10bc0 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
10bd0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10be0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
10bf0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10c00 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
10c10 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
10c20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
10c30 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
10c40 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
10c50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
10c60 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
10c70 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10c80 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
10c90 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
10ca0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
10cb0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
10cc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10cd0 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
10ce0 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
10cf0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
10d00 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
10d10 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
10d20 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
10d30 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
10d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10d60 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
10d70 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
10d80 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
10d90 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
10da0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10db0 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10dd0 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
10de0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10df0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10e00 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 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 2a 2a 2a 2a 2a  ****************
10e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ec0 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
10ed0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
10ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ef0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
10f00 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
10f10 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
10f20 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
10f30 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
10f40 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
10f50 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
10f60 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
10f70 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
10f80 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
10f90 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
10fa0 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
10fb0 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
10fc0 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
10fd0 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
10fe0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
10ff0 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
11000 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
11010 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
11020 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
11030 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
11040 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
11050 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
11060 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
11070 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
11080 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
11090 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
110a0 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
110b0 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
110c0 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
110d0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
110e0 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
110f0 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
11100 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
11110 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
11120 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
11130 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
11140 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
11150 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
11160 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
11170 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
11180 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
11190 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
111a0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
111b0 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
111c0 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
111d0 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
111e0 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
111f0 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
11200 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
11210 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
11220 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
11230 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
11240 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
11250 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
11260 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
11270 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
11280 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
11290 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
112a0 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
112b0 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
112c0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
112d0 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
112e0 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
112f0 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
11300 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
11310 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
11320 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11330 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
11340 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
11350 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
11360 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
11370 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
11380 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
11390 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
113a0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
113b0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
113c0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
113d0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
113e0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
113f0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11400 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11410 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11420 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
11430 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
11440 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
11450 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
11460 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
11470 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
11480 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
11490 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
114a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
114b0 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
114c0 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
114d0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
114e0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
114f0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
11500 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
11510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11520 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
11530 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
11540 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
11550 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
11560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11570 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
11580 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
11590 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
115a0 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
115b0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
115c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
115d0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
115e0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
115f0 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
11600 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
11610 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
11620 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
11630 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
11640 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
11650 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11660 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
11670 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
11680 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
11690 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
116a0 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
116b0 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
116c0 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
116d0 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
116e0 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
116f0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
11700 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
11710 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
11720 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
11730 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
11740 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11750 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
11760 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
11770 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11780 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
11790 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
117a0 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
117b0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
117c0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
117d0 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
117e0 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
117f0 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
11800 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11810 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11820 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11830 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11840 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11850 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
11860 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
11870 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
11880 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
11890 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
118a0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
118b0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
118c0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
118d0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
118e0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
118f0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11900 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11910 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11920 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11930 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11940 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11950 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11960 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11970 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11980 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11990 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
119a0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
119b0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
119c0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
119d0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
119e0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
119f0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11a00 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11a10 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11a20 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11a30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11a40 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11a50 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11a60 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11a70 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11a80 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11a90 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11aa0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11ab0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11ac0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11ad0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
11ae0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
11af0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
11b00 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11b10 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11b20 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
11b30 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11b40 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
11b50 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
11b60 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
11b70 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
11b80 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
11b90 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
11ba0 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
11bb0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
11bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11bd0 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11be0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11bf0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
11c00 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11c10 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11c20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11c30 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
11c40 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
11c50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11c60 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
11c70 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
11c80 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
11c90 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
11ca0 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
11cb0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
11cc0 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
11cd0 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
11ce0 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
11cf0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11d00 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
11d10 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11d20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11d30 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
11d40 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
11d50 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
11d60 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
11d70 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
11d80 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
11d90 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
11da0 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
11db0 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
11dc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
11dd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11de0 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
11df0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11e00 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
11e10 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
11e20 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
11e30 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
11e40 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
11e50 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
11e60 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
11e70 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11e80 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
11e90 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
11ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11eb0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
11ec0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11ed0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
11ee0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
11ef0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
11f00 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
11f10 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11f20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
11f30 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
11f40 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
11f50 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
11f60 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20  c;.  } .  .  /* 
11f70 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
11f80 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
11f90 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
11fa0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
11fb0 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
11fc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
11fd0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
11fe0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
11ff0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
12000 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
12010 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
12020 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
12030 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
12040 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
12050 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
12060 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
12070 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
12080 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
12090 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
120a0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
120b0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
120c0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
120d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
120e0 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
120f0 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
12100 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
12110 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
12120 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12130 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
12140 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
12150 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12160 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
12170 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
12180 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
12190 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
121a0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
121b0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
121c0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
121d0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
121e0 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
121f0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
12200 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
12210 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
12220 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
12230 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
12240 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
12250 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
12260 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
12270 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12280 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
12290 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
122a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
122b0 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20  /* To downgrade 
122c0 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c  to shared, simpl
122d0 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  y update our int
122e0 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20  ernal notion of 
122f0 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74  the.  ** lock st
12300 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ate.  No need to
12310 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66   mess with the f
12320 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a  ile on disk..  *
12330 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
12340 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
12350 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
12360 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
12370 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
12380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12390 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79    .  /* To fully
123a0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
123b0 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  base, delete the
123c0 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
123d0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
123e0 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  k==NO_LOCK );.  
123f0 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f  rc = osRmdir(zLo
12400 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  ckFile);.  if( r
12410 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  c<0 && errno==EN
12420 4f 54 44 49 52 20 29 20 72 63 20 3d 20 6f 73 55  OTDIR ) rc = osU
12430 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
12440 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
12450 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
12460 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
12470 20 30 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45   0;.    if( ENOE
12480 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
12490 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
124a0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
124b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
124c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
124d0 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
124e0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
124f0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
12500 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
12510 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
12520 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
12530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12540 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
12550 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
12560 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
12570 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
12580 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
12590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
125a0 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
125b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
125c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
125d0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29  E_OK;.  if( id )
125e0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
125f0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12600 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
12610 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
12620 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
12630 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
12640 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
12650 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
12660 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
12670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f  ** End of the do
126a0 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c  t-file lock impl
126b0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
12720 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
12730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
12790 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a   flock Locking *
127a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
127c0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c  **.** Use the fl
127d0 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ock() system cal
127e0 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63  l to do file loc
127f0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  king..**.** floc
12800 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  k() locking is l
12810 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  ike dot-file loc
12820 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65  king in that the
12830 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65   various.** fine
12840 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c  -grain locking l
12850 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20  evels supported 
12860 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f  by SQLite are co
12870 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20  llapsed into.** 
12880 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69  a single exclusi
12890 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68  ve lock.  In oth
128a0 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44  er words, SHARED
128b0 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a  , RESERVED, and.
128c0 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73  ** PENDING locks
128d0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68   are the same th
128e0 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53  ing as an EXCLUS
128f0 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74  IVE lock.  SQLit
12900 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73  e.** still works
12910 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69   when you do thi
12920 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e  s, but concurren
12930 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69  cy is reduced si
12940 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  nce.** only a si
12950 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
12960 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
12970 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69  database at a ti
12980 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74  me..**.** Omit t
12990 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53  his section if S
129a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
129b0 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75  KING_STYLE is tu
129c0 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a  rned off or if.*
129d0 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20  * compiling for 
129e0 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20  VXWORKS..*/.#if 
129f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
12a00 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
12a10 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
12a20 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20  * Retry flock() 
12a30 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
12a40 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69  with EINTR.*/.#i
12a50 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69  fdef EINTR.stati
12a60 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f  c int robust_flo
12a70 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ck(int fd, int o
12a80 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
12a90 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66  do{ rc = flock(f
12aa0 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72  d,op); }while( r
12ab0 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
12ac0 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
12ad0 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
12ae0 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63  fine robust_floc
12af0 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62  k(a,b) flock(a,b
12b00 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a  ).#endif.     ..
12b10 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12b20 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
12b30 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
12b40 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
12b50 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
12b60 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
12b70 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
12b80 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
12b90 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
12ba0 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
12bb0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
12bc0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
12bd0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
12be0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
12bf0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
12c00 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
12c10 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
12c20 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
12c30 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
12c40 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68  atic int flockCh
12c50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
12c60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12c70 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
12c80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12c90 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
12ca0 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
12cb0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12cc0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
12cd0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
12ce0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
12cf0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
12d00 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
12d10 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12d20 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   );.  .  /* Chec
12d30 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
12d40 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
12d50 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
12d60 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
12d70 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
12d80 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
12d90 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
12da0 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
12db0 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
12dc0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
12dd0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
12de0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
12df0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
12e00 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
12e10 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73   int lrc = robus
12e20 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
12e30 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
12e40 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c  _NB);.    if( !l
12e50 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67  rc ){.      /* g
12e60 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c  ot the lock, unl
12e70 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ock it */.      
12e80 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
12e90 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
12ea0 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
12eb0 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
12ec0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12ed0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rrno;.        /*
12ee0 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
12ef0 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
12f00 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51          lrc = SQ
12f10 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12f20 4b 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  K; .        if( 
12f30 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12f40 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
12f50 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
12f60 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
12f70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72           rc = lr
12f80 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
12f90 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
12fa0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
12fb0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
12fc0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
12fd0 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
12fe0 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65   else might have
12ff0 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a   it reserved */.
13000 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
13010 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
13020 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
13030 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
13040 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  ; .      if( IS_
13050 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
13060 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
13070 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
13080 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
13090 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
130a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
130b0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
130c0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
130d0 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
130e0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
130f0 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
13100 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13110 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
13120 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
13130 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
13140 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
13150 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13160 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
13170 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
13180 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
13190 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
131a0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
131b0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
131c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
131d0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
131e0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
131f0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
13200 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
13210 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
13220 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
13230 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
13240 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
13250 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
13260 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
13270 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
13280 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
13290 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
132a0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
132b0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
132c0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
132d0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
132e0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
132f0 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
13300 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
13310 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
13320 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
13330 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
13340 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
13350 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
13360 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
13370 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
13380 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
13390 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
133a0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
133b0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
133c0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
133d0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
133e0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
133f0 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
13400 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
13410 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
13420 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13430 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
13440 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
13450 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
13460 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
13470 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
13480 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
13490 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
134a0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
134b0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
134c0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
134d0 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
134e0 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
134f0 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
13500 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
13510 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
13520 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
13530 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
13540 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
13550 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
13560 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
13570 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
13580 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
13590 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
135a0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
135b0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
135c0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
135d0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
135e0 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
135f0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13600 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13610 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13620 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
13630 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13640 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
13650 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
13660 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
13670 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
13680 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
13690 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
136a0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
136b0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
136c0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
136d0 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
136e0 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
136f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13700 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
13710 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13720 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
13730 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
13740 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
13750 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
13760 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
13770 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
13780 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
13790 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
137a0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
137b0 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
137c0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
137d0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
137e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
137f0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
13800 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13810 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
13820 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
13830 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rrno);.    }.  }
13840 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
13850 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
13860 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
13870 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
13880 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
13890 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54  eLock;.  }.  OST
138a0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
138b0 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c  d %s %s (flock)\
138c0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
138d0 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
138e0 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ck), .          
138f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
13900 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
13910 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
13920 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
13930 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
13940 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
13950 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
13960 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
13970 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
13980 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13990 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
139a0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
139b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
139c0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
139d0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
139e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
139f0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
13a00 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
13a10 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
13a20 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
13a30 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13a40 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
13a50 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
13a60 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
13a70 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
13a80 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
13a90 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
13aa0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
13ab0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
13ac0 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
13ad0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
13ae0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
13af0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
13b00 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13b10 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
13b20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13b30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
13b40 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
13b50 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b  %d pid=%d (flock
13b60 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13b70 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
13b80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
13b90 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
13ba0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
13bb0 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
13bc0 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
13bd0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
13be0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
13bf0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
13c00 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
13c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13c20 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
13c30 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
13c40 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
13c50 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
13c60 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
13c70 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
13c80 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
13c90 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13ca0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
13cb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13cc0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
13cd0 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b  , really, unlock
13ce0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73  . */.  if( robus
13cf0 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
13d00 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69  , LOCK_UN) ){.#i
13d10 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
13d20 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13d30 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20  RORS.    return 
13d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
13d50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
13d60 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13d70 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75  RORS */.    retu
13d80 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13d90 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b  UNLOCK;.  }else{
13da0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13db0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
13dc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13dd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
13de0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
13df0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13e00 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  flockClose(sqlit
13e10 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
13e20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13e30 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b  _OK;.  if( id ){
13e40 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  .    flockUnlock
13e50 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
13e60 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
13e70 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
13e80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
13e90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13ea0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
13eb0 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
13ec0 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RK */../********
13ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
13ee0 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63  of the flock loc
13ef0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
13f00 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
13f10 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f60 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
13f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fb0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
13fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fd0 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d   Begin Named Sem
13fe0 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a  aphore Locking *
13ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14000 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61  *******.**.** Na
14010 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
14020 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75  cking is only su
14030 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72  pported on VxWor
14040 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  ks..**.** Semaph
14050 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  ore locking is l
14060 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64  ike dot-lock and
14070 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69   flock in that i
14080 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a  t really only.**
14090 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53   supports EXCLUS
140a0 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e  IVE locking.  On
140b0 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
140c0 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20  ess can read or 
140d0 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74  write.** the dat
140e0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20  abase file at a 
140f0 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75  time.  This redu
14100 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f  ces potential co
14110 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a  ncurrency, but.*
14120 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b  * makes the lock
14130 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14140 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a  much easier..*/.
14150 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  #if OS_VXWORKS..
14160 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14170 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
14180 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
14190 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
141a0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
141b0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
141c0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
141d0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
141e0 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
141f0 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
14200 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
14210 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
14220 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
14230 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
14240 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
14250 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
14260 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
14270 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
14280 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
14290 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63  atic int semChec
142a0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
142b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
142c0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
142d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
142e0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
142f0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
14300 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14310 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
14320 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14340 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
14350 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
14360 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14370 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
14380 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
14390 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
143a0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
143b0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
143c0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
143d0 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
143e0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
143f0 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
14400 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
14410 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
14420 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
14430 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
14440 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
14450 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
14460 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
14470 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
14480 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
14490 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
144a0 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72  f( EAGAIN != tEr
144b0 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rno ){.        r
144c0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
144d0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
144e0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
144f0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14500 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  LOCK);.        s
14510 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
14520 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
14530 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
14540 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
14550 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63  else has the loc
14560 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e  k when we are in
14570 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20   NO_LOCK */.    
14580 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28      reserved = (
14590 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
145a0 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
145b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
145c0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
145d0 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
145e0 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
145f0 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
14600 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
14610 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
14620 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
14630 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
14640 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
14650 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
14660 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
14670 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14680 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
14690 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
146a0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
146b0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
146c0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
146d0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
146e0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
146f0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
14700 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
14710 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
14720 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
14730 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
14740 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
14750 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
14760 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
14770 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14780 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14790 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
147a0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
147b0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
147c0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
147d0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
147e0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
147f0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14800 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
14810 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
14820 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
14830 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
14840 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
14850 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
14860 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
14870 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14880 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14890 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
148a0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
148b0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
148c0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
148d0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
148e0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
148f0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14900 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14910 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
14920 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
14930 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
14940 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
14950 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
14960 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
14970 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
14980 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
14990 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
149a0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
149b0 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
149c0 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
149d0 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
149e0 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
149f0 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
14a00 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
14a10 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
14a20 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
14a30 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
14a40 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
14a50 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
14a60 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
14a70 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14a80 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14a90 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14aa0 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33   semLock(sqlite3
14ab0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14ac0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
14ad0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14ae0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14af0 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
14b00 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
14b10 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
14b20 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
14b30 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
14b40 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
14b50 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
14b60 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
14b70 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
14b80 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
14b90 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
14ba0 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
14bb0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
14bc0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
14bd0 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
14be0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
14bf0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
14c00 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
14c10 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
14c20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
14c30 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
14c40 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
14c50 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
14c60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14c70 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
14c80 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
14c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
14ca0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
14cb0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
14cc0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
14cd0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14ce0 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
14cf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14d00 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
14d10 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14d20 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
14d30 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
14d40 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
14d50 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
14d60 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
14d70 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
14d80 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
14d90 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
14da0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
14db0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
14dc0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
14dd0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
14de0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
14df0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
14e00 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
14e10 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
14e20 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14e30 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
14e40 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14e50 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
14e60 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
14e70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
14e80 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14e90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
14ea0 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
14eb0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
14ec0 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
14ed0 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
14ee0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
14ef0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
14f00 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
14f10 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
14f20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
14f30 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
14f40 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
14f50 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
14f60 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
14f70 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
14f80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14f90 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
14fa0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
14fb0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
14fc0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
14fd0 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
14fe0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
14ff0 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
15000 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15010 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
15020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15030 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
15040 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
15050 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
15060 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
15070 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
15080 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
15090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
150a0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
150b0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
150c0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
150d0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
150e0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
150f0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
15100 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
15110 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
15120 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
15130 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15140 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
15150 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15160 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
15170 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
15180 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73  c int semClose(s
15190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
151a0 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
151b0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
151c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
151d0 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63  id;.    semUnloc
151e0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
151f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
15200 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
15210 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
15220 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
15230 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
15240 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
15250 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
15260 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
15270 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15280 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
15290 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
152a0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
152b0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
152c0 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
152d0 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
152e0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
152f0 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
15300 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
15310 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
15320 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
15330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15370 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
15380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153c0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
153d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153e0 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
153f0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
15400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15410 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
15420 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
15430 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
15440 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
15450 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
15460 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
15470 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
15480 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
15490 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
154a0 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
154b0 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
154c0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
154d0 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
154e0 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
154f0 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
15500 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
15510 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
15520 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
15530 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
15540 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
15550 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
15560 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
15570 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
15580 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
15590 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
155a0 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
155b0 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
155c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
155d0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
155e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
155f0 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
15600 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15610 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
15620 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
15630 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
15640 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15650 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
15660 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
15670 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
15680 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
15690 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
156a0 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
156b0 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
156c0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
156d0 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
156e0 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
156f0 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
15700 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
15710 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
15720 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
15730 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
15740 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
15750 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
15760 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
15770 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
15780 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
15790 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
157a0 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
157d0 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
157e0 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
157f0 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
15800 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
15810 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
15820 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
15830 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
15840 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
15850 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
15860 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
15870 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
15880 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
15890 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
158a0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
158b0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
158c0 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
158d0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
158e0 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
158f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
15900 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
15910 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
15920 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
15930 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
15940 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
15950 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
15960 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
15970 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
15980 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
15990 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
159a0 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
159b0 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
159c0 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
159d0 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
159e0 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
159f0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
15a00 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
15a10 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
15a20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
15a30 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
15a40 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
15a50 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
15a60 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
15a70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
15a80 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
15a90 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
15aa0 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
15ab0 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
15ac0 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
15ad0 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
15ae0 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
15af0 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
15b00 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
15b10 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
15b20 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
15b30 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
15b40 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
15b50 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
15b60 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
15b70 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
15b80 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
15b90 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
15ba0 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
15bb0 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
15bc0 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
15bd0 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
15be0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
15bf0 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
15c00 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
15c10 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
15c20 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
15c30 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
15c40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15c50 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
15c60 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
15c70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
15c80 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
15c90 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
15ca0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
15cb0 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
15cc0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
15cd0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cf0 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
15d00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
15d10 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
15d20 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
15d30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
15d40 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
15d50 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
15d60 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
15d70 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
15d80 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
15d90 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
15da0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
15db0 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
15dc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15dd0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
15de0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
15df0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
15e00 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
15e10 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
15e20 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
15e30 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
15e40 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
15e50 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
15e60 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
15e70 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
15e80 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
15e90 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
15ea0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
15eb0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
15ec0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
15ed0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
15ee0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
15ef0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
15f00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
15f10 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
15f20 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
15f30 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
15f40 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
15f50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
15f60 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
15f70 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15f80 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15f90 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
15fa0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20  text *context;. 
15fb0 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
15fc0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
15fd0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
15fe0 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
15ff0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
16000 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d  e );.  context =
16010 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
16020 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
16030 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
16040 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
16050 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
16060 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
16070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16080 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
16090 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
160a0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
160b0 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
160c0 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
160d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
160e0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
160f0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
16100 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
16110 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
16120 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
16130 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
16140 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
16150 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
16160 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
16170 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
16180 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
16190 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
161a0 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
161b0 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
161c0 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
161d0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
161e0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
161f0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
16200 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
16210 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
16220 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
16230 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
16240 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
16250 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
16260 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
16270 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
16280 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
16290 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
162a0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
162b0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
162c0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
162d0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
162e0 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
162f0 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
16300 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
16310 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
16320 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
16330 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
16340 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
16350 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
16360 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
16370 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
16380 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
16390 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
163a0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
163b0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
163c0 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
163d0 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
163e0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
163f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16400 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
16410 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
16420 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
16430 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
16440 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
16450 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
16460 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
16470 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
16480 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
16490 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
164a0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
164b0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
164c0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
164d0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
164e0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
164f0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
16500 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
16510 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
16520 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
16530 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
16540 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
16550 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
16560 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
16570 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
16580 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
16590 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
165a0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
165b0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
165c0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
165d0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
165e0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
165f0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
16600 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
16610 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
16620 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
16630 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
16640 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
16650 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
16660 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
16670 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
16680 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
16690 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
166a0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
166b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
166c0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
166d0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
166e0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
166f0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
16700 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
16710 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
16720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
16730 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
16740 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
16750 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
16760 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
16770 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16780 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
16790 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
167a0 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
167b0 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
167c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
167d0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
167e0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
167f0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
16800 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
16810 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
16820 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
16830 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
16840 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
16850 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
16860 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
16870 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
16880 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
16890 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
168a0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
168b0 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
168c0 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
168d0 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
168e0 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
168f0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
16900 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
16910 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
16920 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
16930 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
16940 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
16950 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
16960 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
16970 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
16980 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
16990 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
169a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
169b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
169c0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
169d0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
169e0 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
169f0 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c  ady held) (afp)\
16a00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
16a10 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
16a20 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
16a30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16a40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
16a50 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
16a60 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
16a70 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a   is correct.  **
16a80 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
16a90 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
16aa0 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
16ab0 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
16ac0 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
16ad0 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
16ae0 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
16af0 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
16b00 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
16b10 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
16b20 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
16b30 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
16b40 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
16b50 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
16b60 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
16b70 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
16b80 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16b90 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
16ba0 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
16bb0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
16bc0 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
16bd0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
16be0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
16bf0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
16c00 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
16c10 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
16c20 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
16c30 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
16c40 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
16c50 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
16c60 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
16c70 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
16c80 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
16c90 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
16ca0 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
16cb0 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
16cc0 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
16cd0 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
16ce0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
16cf0 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
16d00 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
16d10 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
16d20 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
16d30 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f  && .       (pIno
16d40 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
16d50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
16d60 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
16d70 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20  LOCK)).     ){. 
16d80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16d90 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  USY;.    goto af
16da0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
16db0 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41    .  /* If a SHA
16dc0 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
16dd0 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
16de0 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
16df0 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
16e00 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
16e10 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
16e20 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
16e30 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
16e40 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
16e50 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
16e60 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
16e70 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
16e80 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  & .     (pInode-
16e90 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
16ea0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
16eb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
16ec0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
16ed0 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
16ee0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16ef0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
16f00 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16f10 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
16f20 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
16f30 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
16f40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
16f50 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
16f60 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
16f70 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
16f80 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
16f90 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
16fa0 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41  .  }.    .  /* A
16fb0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
16fc0 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
16fd0 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
16fe0 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
16ff0 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
17000 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
17010 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
17020 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
17030 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
17040 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
17050 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
17060 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
17070 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
17080 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17090 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
170a0 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
170b0 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
170c0 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66  nt failed;.    f
170d0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
170e0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
170f0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
17100 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
17110 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
17120 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
17130 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
17140 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
17150 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
17160 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
17170 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
17180 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
17190 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
171a0 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
171b0 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
171c0 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
171d0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
171e0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
171f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
17200 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31  lrc1, lrc2, lrc1
17210 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c  Errno = 0;.    l
17220 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20  ong lk, mask;.  
17230 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
17240 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
17250 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17260 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17270 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ck==0 );.       
17280 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69   .    mask = (si
17290 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f  zeof(long)==8) ?
172a0 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a   LARGEST_INT64 :
172b0 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
172c0 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
172d0 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
172e0 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
172f0 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
17300 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
17310 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
17320 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
17330 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
17340 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f  dom(); .    pIno
17350 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d  de->sharedByte =
17360 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48   (lk & mask)%(SH
17370 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
17380 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
17390 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
173a0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
173b0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
173c0 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
173d0 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b  aredByte, 1, 1);
173e0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
173f0 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a  _ERROR(lrc1) ){.
17400 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20        lrc1Errno 
17410 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
17420 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
17430 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
17440 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
17450 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61   */.    lrc2 = a
17460 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17470 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17480 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
17490 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20  1, 0);.    .    
174a0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
174b0 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20  R(lrc1) ) {.    
174c0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
174d0 28 70 46 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e  (pFile, lrc1Errn
174e0 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  o);.      rc = l
174f0 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc1;.      goto 
17500 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
17510 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f    } else if( IS_
17520 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29  LOCK_ERROR(lrc2)
17530 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
17540 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc2;.      goto 
17550 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
17560 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63    } else if( lrc
17570 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  1 != SQLITE_OK )
17580 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72   {.      rc = lr
17590 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  c1;.    } else {
175a0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
175b0 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
175c0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
175d0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
175e0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
175f0 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
17600 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
17610 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
17620 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
17630 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
17640 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
17650 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
17660 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
17670 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
17680 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20  is.     ** same 
17690 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
176a0 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
176b0 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
176c0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
176d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
176e0 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
176f0 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
17700 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
17710 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
17720 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
17730 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
17740 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
17750 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
17760 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
17770 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  */.    int faile
17780 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  d = 0;.    asser
17790 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
177a0 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  leLock );.    if
177b0 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52   (eFileLock >= R
177c0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
177d0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
177e0 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   < RESERVED_LOCK
177f0 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ) {.        /* A
17800 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
17810 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  D lock */.      
17820 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
17830 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17840 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
17850 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
17860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61  );.      if( !fa
17870 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
17880 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
17890 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
178a0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61     }.    if (!fa
178b0 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63  iled && eFileLoc
178c0 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  k == EXCLUSIVE_L
178d0 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
178e0 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
178f0 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
17900 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
17910 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
17920 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
17930 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
17940 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
17950 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
17960 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
17970 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
17980 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f  get the  afpUnlo
17990 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
179a0 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d    if( !(failed =
179b0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
179c0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
179d0 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
179e0 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
179f0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f              pIno
17a00 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
17a10 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 0)) ){.      
17a20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20    int failed2 = 
17a30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
17a40 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d     /* now attemm
17a50 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78  pt to get the ex
17a60 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e  clusive lock ran
17a70 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ge */.        fa
17a80 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
17a90 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17aa0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
17ab0 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ad0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
17ae0 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  IZE, 1);.       
17af0 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28   if( failed && (
17b00 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74  failed2 = afpSet
17b10 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17b20 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
17b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b40 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
17b50 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72  T + pInode->shar
17b60 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29  edByte, 1, 1)) )
17b70 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
17b80 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68  an't reestablish
17b90 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17ba0 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20  .  Sqlite can't 
17bb0 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20  deal, this is.  
17bc0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69          ** a cri
17bd0 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a  tical I/O error.
17be0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
17bf0 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61         rc = ((fa
17c00 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f  iled & SQLITE_IO
17c10 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
17c20 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20  OERR) ? failed2 
17c30 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  : .             
17c40 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c    SQLITE_IOERR_L
17c50 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  OCK;.          g
17c60 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
17c70 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  ;.        } .   
17c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17c90 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a    rc = failed; .
17ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17cb0 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a    if( failed ){.
17cc0 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
17cd0 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  d;.    }.  }.  .
17ce0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17cf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
17d00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
17d10 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
17d20 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
17d30 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
17d40 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
17d50 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
17d60 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
17d70 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
17d80 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
17d90 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
17da0 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
17db0 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c    }.  .afp_end_l
17dc0 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
17dd0 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
17de0 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
17df0 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20  %s %s (afp)\n", 
17e00 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
17e10 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
17e20 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53   .         rc==S
17e30 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
17e40 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
17e50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17e60 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
17e70 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
17e80 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
17e90 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
17ea0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
17eb0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
17ec0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
17ed0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
17ee0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
17ef0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
17f00 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
17f10 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
17f20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
17f30 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
17f40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17f50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
17f60 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63  tic int afpUnloc
17f70 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17f80 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
17f90 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
17fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
17fb0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
17fc0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
17fd0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
17fe0 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b  Inode;.  afpLock
17ff0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
18000 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
18010 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
18020 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
18030 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61  t;.  int skipSha
18040 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  red = 0;.#ifdef 
18050 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
18060 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  t h = pFile->h;.
18070 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
18080 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
18090 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
180a0 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
180b0 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
180c0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
180d0 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
180e0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
180f0 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
18100 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
18110 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
18120 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20  Shared,.        
18130 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a     getpid()));..
18140 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
18150 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
18160 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
18170 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
18180 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
18190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
181a0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
181b0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
181c0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
181d0 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
181e0 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
181f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
18200 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
18210 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
18220 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
18230 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
18240 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
18250 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18260 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
18270 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
18280 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
18290 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
182a0 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20  0);.    .#ifdef 
182b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
182c0 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
182d0 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
182e0 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
182f0 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
18300 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
18310 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
18320 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
18330 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
18340 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
18350 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
18360 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
18370 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
18380 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
18390 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
183a0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
183b0 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
183c0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
183d0 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
183e0 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
183f0 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
18400 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
18410 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
18420 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
18430 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
18440 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
18450 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
18460 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
18470 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
18480 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
18490 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
184a0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
184b0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
184c0 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
184d0 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
184e0 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
184f0 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
18500 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
18510 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
18520 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
18530 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18540 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
18550 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18560 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18570 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18580 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
18590 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
185a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
185b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
185c0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
185d0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
185e0 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
185f0 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
18600 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
18610 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
18620 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
18630 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
18640 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
18650 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
18660 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
18670 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18680 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18690 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
186a0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
186b0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
186c0 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
186d0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
186e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
186f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
18700 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
18710 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
18720 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18730 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18740 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
18750 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
18760 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
18770 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18780 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
18790 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
187a0 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
187b0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
187c0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
187d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
187e0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
187f0 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
18800 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
18810 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
18820 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
18830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18840 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18850 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
18860 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18870 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
18880 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
18890 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
188a0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
188b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
188c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
188d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
188e0 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
188f0 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
18900 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
18910 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
18920 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
18930 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
18940 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
18950 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
18960 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
18970 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
18980 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
18990 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
189a0 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
189b0 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
189c0 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
189d0 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
189e0 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
189f0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
18a00 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
18a10 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18a20 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
18a30 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18a40 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
18a50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18a60 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18a70 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
18a80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18a90 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18aa0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18ab0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
18ac0 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
18ad0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
18ae0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
18af0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
18b00 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
18b10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18b20 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
18b30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18b50 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
18b60 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
18b70 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18b80 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
18b90 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
18ba0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
18bb0 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
18bc0 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
18bd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
18be0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
18bf0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18c00 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
18c10 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18c20 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
18c30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
18c40 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
18c50 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
18c60 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
18c70 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
18c80 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
18c90 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
18ca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18cb0 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
18cc0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
18cd0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
18ce0 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63  id;.    afpUnloc
18cf0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
18d00 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
18d10 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
18d20 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70  ile->pInode && p
18d30 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
18d40 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
18d50 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
18d60 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
18d70 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
18d80 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
18d90 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
18da0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
18db0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
18dc0 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
18dd0 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
18de0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
18df0 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65  r to pInode->aPe
18e00 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
18e10 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
18e20 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
18e30 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
18e40 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
18e50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
18e60 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
18e70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
18e80 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
18e90 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  File);.    sqlit
18ea0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
18eb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
18ec0 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
18ed0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
18ee0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
18ef0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18f00 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
18f10 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
18f20 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
18f30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
18f40 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
18f50 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
18f60 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
18f70 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
18f80 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
18f90 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
18fa0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
18fb0 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
18fc0 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
18fd0 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
18fe0 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75  ailable.  If you
18ff0 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66   don't compile f
19000 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74  or a mac, then t
19010 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a  he "unix-afp".**
19020 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69   VFS is not avai
19030 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  lable..**.******
19040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
19050 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c  End of the AFP l
19060 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
19070 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
19080 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
19090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190d0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
190e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
19130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19140 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53  ****** Begin NFS
19150 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
19160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20  *********/..#if 
19180 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19190 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
191a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
191b0 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74  E./*. ** Lower t
191c0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
191d0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
191e0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
191f0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
19200 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  ck. ** must be e
19210 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
19220 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
19230 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
19240 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
19250 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19260 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
19270 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
19280 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
19290 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
192a0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
192b0 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
192c0 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  t nfsUnlock(sqli
192d0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
192e0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
192f0 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
19300 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
19310 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
19320 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
19330 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
19340 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19350 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
19360 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
19370 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
19380 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
19390 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
193a0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
193b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
193c0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
193d0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
193e0 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
193f0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
19400 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
19410 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
19420 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
19430 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
19440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19450 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a 2a 2a 2a  ****************
19480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
194a0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
194b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
19500 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
19510 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
19520 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
19530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19540 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
19550 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
19560 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
19570 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
19580 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
19590 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
195a0 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
195b0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
195c0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
195d0 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
195e0 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
195f0 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
19600 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
19610 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
19620 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
19630 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
19640 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
19650 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
19660 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
19670 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
19680 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
19690 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
196a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
196b0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
196c0 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
196d0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
196e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
196f0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
19700 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
19710 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
19720 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
19730 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
19740 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
19750 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
19760 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
19770 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
19780 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
19790 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
197a0 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
197b0 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
197c0 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
197d0 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66  READ.** in any f
197e0 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
197f0 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
19800 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
19810 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
19820 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
19830 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
19840 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
19850 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
19860 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
19870 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
19880 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
19890 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
198a0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
198b0 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
198c0 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
198d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
198e0 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
198f0 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
19900 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
19910 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
19920 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
19930 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
19940 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
19950 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
19960 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
19970 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
19980 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
19990 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e    assert( id->h>
199a0 32 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78  2 );.  cnt &= 0x
199b0 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66  1ffff;.  do{.#if
199c0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
199d0 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
199e0 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
199f0 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19a00 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19a10 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
19a20 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
19a30 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
19a40 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
19a50 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19a60 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
19a70 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19a80 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19a90 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
19aa0 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19ab0 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19ac0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19ad0 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
19ae0 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
19af0 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
19b00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
19b10 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
19b20 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
19b30 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
19b40 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  e*)id, errno);. 
19b50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19b60 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
19b70 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
19b80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
19b90 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19ba0 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
19bb0 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
19bc0 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
19bd0 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
19be0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
19bf0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
19c00 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
19c10 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
19c20 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
19c30 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
19c40 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
19c50 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
19c60 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
19c70 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
19c80 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
19c90 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
19ca0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
19cb0 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
19cc0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
19cd0 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
19ce0 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
19cf0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
19d00 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
19d10 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
19d20 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
19d30 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
19d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
19d50 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
19d60 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
19d70 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
19d80 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
19d90 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
19da0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
19db0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
19dc0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
19dd0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
19de0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
19df0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
19e00 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
19e10 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
19e20 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
19e30 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
19e40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19e50 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
19e60 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
19e70 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
19e80 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
19e90 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19ea0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
19eb0 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
19ec0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
19ed0 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
19ee0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
19ef0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
19f00 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19f10 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
19f20 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
19f30 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
19f40 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
19f50 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
19f60 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
19f70 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
19f80 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
19f90 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
19fa0 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
19fb0 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
19fc0 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
19fd0 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
19fe0 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
19ff0 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
1a000 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1a010 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
1a020 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
1a030 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
1a040 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1a050 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1a060 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1a070 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1a080 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1a090 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1a0a0 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1a0b0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1a0c0 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1a0d0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1a0e0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1a0f0 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1a100 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1a110 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
1a120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a130 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1a140 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1a150 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1a160 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1a170 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
1a180 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1a190 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1a1a0 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
1a1b0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1a1c0 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1a1d0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1a1e0 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1a1f0 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1a200 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67  .  }.#endif..  g
1a210 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
1a220 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1a230 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
1a240 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
1a250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a260 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
1a270 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
1a280 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
1a290 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
1a2a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a2b0 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
1a2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65  }else{.    store
1a2d0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1a2e0 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20   0);   /* not a 
1a2f0 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1a300 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
1a310 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
1a320 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
1a330 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
1a340 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
1a350 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d  f)[got], 0, amt-
1a360 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  got);.    return
1a370 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1a380 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a  ORT_READ;.  }.}.
1a390 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1a3a0 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d  o seek the file-
1a3b0 64 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65  descriptor passe
1a3c0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1a3d0 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62  rgument to.** ab
1a3e0 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f  solute offset iO
1a3f0 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  ff, then attempt
1a400 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62   to write nBuf b
1a410 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f  ytes of data fro
1a420 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e  m.** pBuf to it.
1a430 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1a440 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  urs, return -1 a
1a450 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e  nd set *piErrno.
1a460 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
1a470 72 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61  return the actua
1a480 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
1a490 73 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68  s written (which
1a4a0 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61   may be less tha
1a4b0 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73  n.** nBuf)..*/.s
1a4c0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1a4d0 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20  dWriteFd(.  int 
1a4e0 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a500 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1a510 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
1a520 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20  i64 iOff,       
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74  /* File offset t
1a550 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
1a560 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  at */.  const vo
1a570 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1a580 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1a590 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62  data from this b
1a5a0 75 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c  uffer to the fil
1a5b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c  e */.  int nBuf,
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a5e0 66 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e  f buffer pBuf in
1a5f0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
1a600 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20  *piErrno        
1a610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a620 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72  UT: Error number
1a630 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73   if error occurs
1a640 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a650 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1a660 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1a670 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79  e returned by sy
1a680 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  stem call */..  
1a690 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e  assert( nBuf==(n
1a6a0 42 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a  Buf&0x1ffff) );.
1a6b0 20 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29    assert( fd>2 )
1a6c0 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66  ;.  nBuf &= 0x1f
1a6d0 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41  fff;.  TIMER_STA
1a6e0 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  RT;..#if defined
1a6f0 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f  (USE_PREAD).  do
1a700 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74 65 28  { rc = osPwrite(
1a710 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20  fd, pBuf, nBuf, 
1a720 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72  iOff); }while( r
1a730 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
1a740 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66  NTR );.#elif def
1a750 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1a760 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 50  ).  do{ rc = osP
1a770 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75 66  write64(fd, pBuf
1a780 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77  , nBuf, iOff);}w
1a790 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1a7a0 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c  rno==EINTR);.#el
1a7b0 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34  se.  do{.    i64
1a7c0 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66   iSeek = lseek(f
1a7d0 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45  d, iOff, SEEK_SE
1a7e0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1a7f0 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d  IOError( iSeek--
1a800 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 53 65   );..    if( iSe
1a810 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20  ek!=iOff ){.    
1a820 20 20 69 66 28 20 70 69 45 72 72 6e 6f 20 29 20    if( piErrno ) 
1a830 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69 53 65 65  *piErrno = (iSee
1a840 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20  k==-1 ? errno : 
1a850 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
1a860 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   -1;.    }.    r
1a870 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20  c = osWrite(fd, 
1a880 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d  pBuf, nBuf);.  }
1a890 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1a8a0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1a8b0 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45  endif..  TIMER_E
1a8c0 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ND;.  OSTRACE(("
1a8d0 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
1a8e0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
1a8f0 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49  fd, rc, iOff, TI
1a900 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a  MER_ELAPSED));..
1a910 20 20 69 66 28 20 72 63 3c 30 20 26 26 20 70 69    if( rc<0 && pi
1a920 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f  Errno ) *piErrno
1a930 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75   = errno;.  retu
1a940 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1a950 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
1a960 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65  set in id->offse
1a970 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  t then read cnt 
1a980 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
1a990 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1a9a0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1a9b0 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55  ctually read.  U
1a9c0 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74  pdate the offset
1a9d0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1a9e0 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
1a9f0 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
1aa00 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20  ailed write the 
1aa10 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
1aa20 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
1aa30 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1aa40 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1aa50 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20  dWrite(unixFile 
1aa60 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *id, i64 offset,
1aa70 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1aa80 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72  f, int cnt){.  r
1aa90 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69  eturn seekAndWri
1aaa0 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73  teFd(id->h, offs
1aab0 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26  et, pBuf, cnt, &
1aac0 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  id->lastErrno);.
1aad0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
1aae0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1aaf0 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
1ab00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1ab10 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
1ab20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
1ab30 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
1ab40 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
1ab50 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20  nt unixWrite(.  
1ab60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1ab70 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
1ab80 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1ab90 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1aba0 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20  64 offset .){.  
1abb0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1abc0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1abd0 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30  .  int wrote = 0
1abe0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1abf0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
1ac00 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
1ac10 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
1ac20 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
1ac30 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
1ac40 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
1ac50 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
1ac60 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
1ac70 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
1ac80 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
1ac90 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
1aca0 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
1acb0 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
1acc0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1acd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1ace0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1acf0 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1ad00 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1ad10 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ad20 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
1ad30 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1ad40 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1ad50 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1ad60 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
1ad70 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1ad80 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1ad90 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1ada0 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1adb0 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
1adc0 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
1add0 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
1ade0 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
1adf0 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
1ae00 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1ae10 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1ae20 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
1ae30 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
1ae40 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
1ae50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1ae60 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
1ae70 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
1ae80 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
1ae90 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1aea0 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
1aeb0 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
1aec0 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
1aed0 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
1aee0 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
1aef0 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
1af00 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1af10 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1af20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
1af30 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
1af40 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
1af50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1af60 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
1af70 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
1af80 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
1af90 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
1afa0 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
1afb0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
1afc0 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1afd0 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
1afe0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
1aff0 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
1b000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1b010 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1b020 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1b030 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
1b040 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
1b050 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
1b060 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
1b070 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
1b080 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
1b090 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
1b0a0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
1b0b0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
1b0c0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1b0d0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
1b0e0 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
1b0f0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
1b100 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1b110 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1b120 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1b130 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
1b140 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b160 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
1b170 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
1b180 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
1b190 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1b1a0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1b1b0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1b1c0 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
1b1d0 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
1b1e0 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
1b1f0 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
1b200 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
1b210 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
1b220 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28  #endif..  while(
1b230 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
1b240 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1b250 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
1b260 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
1b270 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
1b280 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
1b290 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
1b2a0 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
1b2b0 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
1b2c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
1b2d0 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
1b2e0 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
1b2f0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
1b300 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
1b310 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30  ));..  if( amt>0
1b320 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74   ){.    if( wrot
1b330 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61  e<0 && pFile->la
1b340 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20  stErrno!=ENOSPC 
1b350 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
1b360 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1b370 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
1b380 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b390 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1b3a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1b3b0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1b3c0 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20  ile, 0); /* not 
1b3d0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1b3e0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1b3f0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1b400 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1b410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1b420 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1b430 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1b440 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
1b450 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
1b460 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
1b470 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
1b480 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
1b490 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
1b4a0 75 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  urring at the ri
1b4b0 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
1b4c0 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
1b4d0 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
1b4e0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1b4f0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
1b500 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f  ../*.** We do no
1b510 74 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20  t trust systems 
1b520 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72  to provide a wor
1b530 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29  king fdatasync()
1b540 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f  .  Some do..** O
1b550 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f  thers do no.  To
1b560 20 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c   be safe, we wil
1b570 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65  l stick with the
1b580 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65   (slightly slowe
1b590 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49  r).** fsync(). I
1b5a0 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20  f you know that 
1b5b0 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73  your system does
1b5c0 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79   support fdatasy
1b5d0 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a  nc() correctly,.
1b5e0 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63  ** then simply c
1b5f0 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64  ompile with -Dfd
1b600 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e  atasync=fdatasyn
1b610 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44 41 54  c or -DHAVE_FDAT
1b620 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65  ASYNC.*/.#if !de
1b630 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
1b640 20 26 26 20 21 48 41 56 45 5f 46 44 41 54 41 53   && !HAVE_FDATAS
1b650 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61  YNC.# define fda
1b660 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
1b670 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
1b680 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1b690 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
1b6a0 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
1b6b0 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
1b6c0 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
1b6d0 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
1b6e0 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
1b6f0 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
1b700 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
1b710 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
1b720 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
1b730 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
1b740 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
1b750 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
1b760 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
1b770 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
1b780 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
1b790 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
1b7a0 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
1b7b0 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
1b7c0 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
1b7d0 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
1b7e0 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
1b7f0 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
1b800 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
1b810 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
1b820 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
1b830 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
1b840 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
1b850 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
1b860 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
1b870 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
1b880 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
1b890 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
1b8a0 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
1b8b0 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
1b8c0 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
1b8d0 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
1b8e0 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
1b8f0 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
1b900 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
1b910 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
1b920 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
1b930 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
1b940 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
1b950 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b960 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  e..**.** SQLite 
1b970 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c  sets the dataOnl
1b980 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69  y flag if the si
1b990 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
1b9a0 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  s unchanged..** 
1b9b0 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20  The idea behind 
1b9c0 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74  dataOnly is that
1b9d0 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   it should only 
1b9e0 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63  write the file c
1b9f0 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73  ontent.** to dis
1ba00 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65  k, not the inode
1ba10 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64  .  We only set d
1ba20 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66  ataOnly if the f
1ba30 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20  ile size is .** 
1ba40 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  unchanged since 
1ba50 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
1ba60 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f   part of the ino
1ba70 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a  de.  However, .*
1ba80 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73  * Ted Ts'o tells
1ba90 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79   us that fdatasy
1baa0 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77  nc() will also w
1bab0 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69  rite the inode i
1bac0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69  f the.** file si
1bad0 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ze has changed. 
1bae0 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64   The only real d
1baf0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1bb00 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a  n fdatasync().**
1bb10 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65   and fsync(), Te
1bb20 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74  d tells us, is t
1bb30 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
1bb40 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74  will not flush t
1bb50 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74  he.** inode if t
1bb60 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65  he mtime or owne
1bb70 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65  r or other inode
1bb80 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65   attributes have
1bb90 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20   changed..** We 
1bba0 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
1bbb0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e  the file size, n
1bbc0 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c  ot the other fil
1bbd0 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f  e attributes, so
1bbe0 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51  .** as far as SQ
1bbf0 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65  Lite is concerne
1bc00 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28  d, an fdatasync(
1bc10 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71  ) is always adeq
1bc20 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20  uate..** So, we 
1bc30 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61  always use fdata
1bc40 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20  sync() if it is 
1bc50 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72  available, regar
1bc60 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20  dless of.** the 
1bc70 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
1bc80 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73  aOnly flag..*/.s
1bc90 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
1bca0 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
1bcb0 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
1bcc0 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
1bcd0 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  rc;..  /* The fo
1bce0 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65  llowing "ifdef/e
1bcf0 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b  lif/else/" block
1bd00 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74   has the same st
1bd10 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20  ructure as.  ** 
1bd20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49  the one below. I
1bd30 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20  t is replicated 
1bd40 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61  here solely to a
1bd50 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20  void cluttering 
1bd60 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61  .  ** up the rea
1bd70 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20  l code with the 
1bd80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bd90 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a  () macros..  */.
1bda0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1bdb0 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  _SYNC.  UNUSED_P
1bdc0 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1bdd0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bde0 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1bdf0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1be00 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20  ataOnly);.#elif 
1be10 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1be20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1be30 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1be40 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
1be50 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1be60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1be70 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1be80 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f  endif..  /* Reco
1be90 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
1bea0 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64   times that we d
1beb0 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63  o a normal fsync
1bec0 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c  () and .  ** FUL
1bed0 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20  LSYNC.  This is 
1bee0 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74  used during test
1bef0 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
1bf00 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  at this procedur
1bf10 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c  e.  ** gets call
1bf20 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  ed with the corr
1bf30 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ect arguments.. 
1bf40 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1bf50 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c  E_TEST.  if( ful
1bf60 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f  lSync ) sqlite3_
1bf70 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
1bf80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  ;.  sqlite3_sync
1bf90 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
1bfa0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
1bfb0 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
1bfc0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
1bfd0 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
1bfe0 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
1bff0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1c000 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63  ITE_NO_SYNC.  rc
1c010 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
1c020 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1c030 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
1c040 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c ){.    rc = os
1c050 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
1c060 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
1c070 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
1c080 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
1c090 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
1c0a0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
1c0b0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
1c0c0 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
1c0d0 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
1c0e0 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
1c0f0 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
1c100 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
1c110 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
1c120 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
1c130 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
1c140 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
1c150 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
1c160 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
1c170 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
1c180 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
1c190 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
1c1a0 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
1c1b0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
1c1c0 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
1c1d0 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
1c1e0 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
1c1f0 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
1c200 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1c210 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1c220 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1c230 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1c240 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1c250 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1c260 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1c270 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1c280 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1c290 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1c2a0 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1c2b0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1c2c0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1c2d0 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1c2e0 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1c2f0 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1c300 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1c310 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1c320 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1c330 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1c340 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1c350 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1c360 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1c370 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1c380 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1c390 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1c3a0 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1c3b0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1c3c0 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1c3d0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1c3e0 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1c3f0 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1c400 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1c410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c420 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1c430 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
1c440 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1c450 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69  taining file zFi
1c460 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75  lename..** If su
1c470 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69  ccessful, *pFd i
1c480 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65  s set to the ope
1c490 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ned file descrip
1c4a0 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  tor and.** SQLIT
1c4b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c4c0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1c4d0 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c  curs, either SQL
1c4e0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20  ITE_NOMEM.** or 
1c4f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1c500 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1c510 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61  *pFd is set to a
1c520 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76  n undefined.** v
1c530 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alue..**.** The 
1c540 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
1c550 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65  escriptor is use
1c560 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74  d for only one t
1c570 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79  hing - to.** fsy
1c580 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79  nc() a directory
1c590 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69   to make sure fi
1c5a0 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  le creation and 
1c5b0 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a  deletion events.
1c5c0 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ** are flushed t
1c5d0 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73  o disk.  Such fs
1c5e0 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65  yncs are not nee
1c5f0 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20  ded on newer.** 
1c600 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73  journaling files
1c610 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20  ystems, but are 
1c620 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65  required on olde
1c630 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  r filesystems..*
1c640 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c650 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
1c660 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53  den using the xS
1c670 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66  etSysCall interf
1c680 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c  ace..** The abil
1c690 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20  ity to override 
1c6a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1c6b0 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72   added in suppor
1c6c0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f  t of the.** chro
1c6d0 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f  mium sandbox.  O
1c6e0 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f  pening a directo
1c6f0 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79  ry is a security
1c700 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a   risk (we are.**
1c710 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67   told) so making
1c720 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65   it overrideable
1c730 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f   allows the chro
1c740 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a  mium sandbox to.
1c750 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20  ** replace this 
1c760 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68  routine with a h
1c770 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20  armless no-op.  
1c780 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75  To make this rou
1c790 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c  tine.** a no-op,
1c7a0 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
1c7b0 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74   a stub that ret
1c7c0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62  urns SQLITE_OK b
1c7d0 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46  ut leaves.** *pF
1c7e0 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74  d set to a negat
1c7f0 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  ive number..**.*
1c800 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1c810 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1c820 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1c830 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
1c840 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
1c850 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
1c860 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
1c870 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
1c880 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
1c890 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1c8a0 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
1c8b0 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
1c8c0 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
1c8d0 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1c8e0 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
1c8f0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1c900 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
1c910 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
1c920 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
1c930 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
1c940 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e  ); ii>1 && zDirn
1c950 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
1c960 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
1c970 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
1c980 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ii] = '\0';.    
1c990 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
1c9a0 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
1c9b0 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
1c9c0 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  ;.    if( fd>=0 
1c9d0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1c9e0 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
1c9f0 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1ca00 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
1ca10 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
1ca20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
1ca30 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45  LITE_OK:unixLogE
1ca40 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1ca50 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
1ca60 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d  ", zDirname));.}
1ca70 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1ca80 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1ca90 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1caa0 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1cab0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1cac0 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1cad0 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1cae0 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1caf0 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1cb00 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1cb10 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1cb20 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1cb30 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1cb40 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1cb50 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1cb60 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1cb70 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1cb80 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1cb90 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1cba0 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1cbb0 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1cbc0 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1cbd0 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1cbe0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1cbf0 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1cc00 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1cc10 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1cc20 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1cc30 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1cc40 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1cc50 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1cc60 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1cc70 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1cc80 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1cc90 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1cca0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1ccb0 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1ccc0 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1ccd0 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1cce0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1ccf0 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1cd00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1cd10 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1cd20 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1cd30 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1cd40 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1cd50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1cd60 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1cd70 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1cd80 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1cd90 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1cda0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1cdb0 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1cdc0 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1cdd0 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1cde0 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1cdf0 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1ce00 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1ce10 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1ce20 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1ce30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1ce40 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1ce50 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1ce60 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1ce70 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1ce80 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1ce90 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1cea0 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1ceb0 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1cec0 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1ced0 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1cee0 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1cef0 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1cf00 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1cf10 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1cf20 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1cf30 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1cf40 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1cf50 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1cf60 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1cf70 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1cf80 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1cf90 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1cfa0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1cfb0 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1cfc0 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1cfd0 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1cfe0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1cff0 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1d000 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72  ( rc ){.    stor
1d010 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1d020 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1d030 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1d040 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1d050 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e  SYNC, "full_fsyn
1d060 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  c", pFile->zPath
1d070 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73  );.  }..  /* Als
1d080 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65  o fsync the dire
1d090 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1d0a0 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65   the file if the
1d0b0 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20   DIRSYNC flag.  
1d0c0 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73  ** is set.  This
1d0d0 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f   is a one-time o
1d0e0 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79  ccurrence.  Many
1d0f0 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c   systems (exampl
1d100 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72  es: AIX).  ** ar
1d110 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e  e unable to fsyn
1d120 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73  c a directory, s
1d130 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  o ignore errors 
1d140 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20  on the fsync..  
1d150 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1d160 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1d170 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a  FILE_DIRSYNC ){.
1d180 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20      int dirfd;. 
1d190 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52     OSTRACE(("DIR
1d1a0 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75  SYNC %s (have_fu
1d1b0 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1d1c0 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1d1d0 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20  e->zPath,.      
1d1e0 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1d1f0 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1d200 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  ));.    rc = osO
1d210 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69  penDirectory(pFi
1d220 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66  le->zPath, &dirf
1d230 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1d240 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72  SQLITE_OK && dir
1d250 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  fd>=0 ){.      f
1d260 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c  ull_fsync(dirfd,
1d270 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f   0, 0);.      ro
1d280 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
1d290 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
1d2a0 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  _);.    }else if
1d2b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
1d2c0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72  TOPEN ){.      r
1d2d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d2e0 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1d2f0 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e  ctrlFlags &= ~UN
1d300 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
1d310 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1d330 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
1d340 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
1d350 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
1d360 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
1d370 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1d380 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
1d390 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1d3a0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1d3b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
1d3c0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1d3d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1d3e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1d3f0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
1d400 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
1d410 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
1d420 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
1d430 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
1d440 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
1d450 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
1d460 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
1d470 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
1d480 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
1d490 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
1d4a0 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
1d4b0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
1d4c0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
1d4d0 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
1d4e0 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
1d4f0 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1d500 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
1d510 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
1d520 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
1d530 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
1d540 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1d550 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  nk;.  }..  rc = 
1d560 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1d570 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
1d580 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1d590 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1d5a0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1d5b0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1d5c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1d5d0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1d5e0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1d5f0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1d600 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
1d610 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1d620 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1d630 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1d640 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1d650 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1d660 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
1d670 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1d680 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1d690 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1d6a0 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
1d6b0 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1d6c0 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
1d6d0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1d6e0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
1d6f0 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
1d700 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
1d710 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1d720 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
1d730 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
1d740 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
1d750 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1d760 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
1d770 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
1d780 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
1d790 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
1d7a0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1d7b0 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
1d7c0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
1d7d0 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1d7e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1d7f0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1d800 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f  MAP_SIZE>0.    /
1d810 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
1d820 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64  s just truncated
1d830 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c   to a size small
1d840 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1d850 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70  ently.    ** map
1d860 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75  ped region, redu
1d870 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1d880 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73   mapping size as
1d890 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69   well. SQLite wi
1d8a0 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65  ll.    ** use re
1d8b0 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
1d8c0 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
1d8d0 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
1d8e0 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20  t from now on.  
1d8f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d900 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61  nByte<pFile->mma
1d910 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  pSize ){.      p
1d920 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1d930 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65   nByte;.    }.#e
1d940 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e  ndif..    return
1d950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d960 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
1d970 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
1d980 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
1d990 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
1d9a0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a   int unixFileSiz
1d9b0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1d9c0 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
1d9d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
1d9e0 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1d9f0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1da00 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75  rc = osFstat(((u
1da10 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
1da20 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
1da30 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1da40 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
1da50 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1da60 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1da70 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  id, errno);.    
1da80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1da90 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
1daa0 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
1dab0 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
1dac0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
1dad0 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
1dae0 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  the findInodeInf
1daf0 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
1db00 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
1db10 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
1db20 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
1db30 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
1db40 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
1db50 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
1db60 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
1db70 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
1db80 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
1db90 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
1dba0 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
1dbb0 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
1dbc0 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
1dbd0 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
1dbe0 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
1dbf0 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
1dc00 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
1dc10 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
1dc20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1dc30 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1dc40 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1dc50 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1dc60 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
1dc70 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
1dc80 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
1dc90 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
1dca0 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
1dcb0 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
1dcc0 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
1dcd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
1dce0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
1dcf0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1dd00 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1dd10 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1dd20 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1dd30 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51  to handle the SQ
1dd40 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1dd50 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f  HINT .** file-co
1dd60 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e  ntrol operation.
1dd70 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61    Enlarge the da
1dd80 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73  tabase to nBytes
1dd90 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75   in size.** (rou
1dda0 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e  nded up to the n
1ddb0 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e  ext chunk-size).
1ddc0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1ddd0 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  e is already.** 
1dde0 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72  nBytes or larger
1ddf0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1de00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1de10 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69  atic int fcntlSi
1de20 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20  zeHint(unixFile 
1de30 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74  *pFile, i64 nByt
1de40 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
1de50 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1de60 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20    i64 nSize;    
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65  /* Required file
1de90 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
1dea0 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20  uct stat buf;   
1deb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1dec0 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72  ed to hold retur
1ded0 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61  n values of fsta
1dee0 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69  t() */.   .    i
1def0 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65  f( osFstat(pFile
1df00 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
1df10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1df20 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1df30 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20     }..    nSize 
1df40 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d  = ((nByte+pFile-
1df50 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46  >szChunk-1) / pF
1df60 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1df70 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1df80 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
1df90 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
1dfa0 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  {..#if defined(H
1dfb0 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1dfc0 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
1dfd0 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20  IX_FALLOCATE.   
1dfe0 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62     /* The code b
1dff0 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67  elow is handling
1e000 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1e010 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65  e of osFallocate
1e020 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  () .      ** cor
1e030 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61  rectly. posix_fa
1e040 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66  llocate() is def
1e050 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73  ined to "returns
1e060 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
1e070 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61  , .      ** or a
1e080 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f  n error number o
1e090 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65  n  failure". See
1e0a0 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72   the manpage for
1e0b0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1e0c0 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
1e0d0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72    do{.        er
1e0e0 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  r = osFallocate(
1e0f0 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  pFile->h, buf.st
1e100 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66  _size, nSize-buf
1e110 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  .st_size);.     
1e120 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49   }while( err==EI
1e130 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  NTR );.      if(
1e140 20 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51   err ) return SQ
1e150 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1e160 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a  ;.#else.      /*
1e170 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20   If the OS does 
1e180 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66  not have posix_f
1e190 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65  allocate(), fake
1e1a0 20 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20   it. Write a .  
1e1b0 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
1e1c0 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
1e1d0 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  yte in each bloc
1e1e0 6b 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74  k that falls ent
1e1f0 69 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77  irely.      ** w
1e200 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64  ithin the extend
1e210 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c  ed region. Then,
1e220 20 69 66 20 72 65 71 75 69 72 65 64 2c 20 61 20   if required, a 
1e230 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20  single byte.    
1e240 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28    ** at offset (
1e250 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74  nSize-1), to set
1e260 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1e270 20 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e   file correctly.
1e280 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
1e290 73 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68  s a similar tech
1e2a0 6e 69 71 75 65 20 74 6f 20 74 68 61 74 20 75 73  nique to that us
1e2b0 65 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73  ed by glibc on s
1e2c0 79 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ystems.      ** 
1e2d0 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65  that do not have
1e2e0 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74   a real fallocat
1e2f0 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20  e() call..      
1e300 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  */.      int nBl
1e310 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69  k = buf.st_blksi
1e320 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73  ze;  /* File-sys
1e330 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a  tem block size *
1e340 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69  /.      int nWri
1e350 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  te = 0;         
1e360 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e370 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 62   bytes written b
1e380 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a  y seekAndWrite *
1e390 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69  /.      i64 iWri
1e3a0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1e3b0 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
1e3c0 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  et to write to *
1e3d0 2f 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65 20  /..      iWrite 
1e3e0 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20  = ((buf.st_size 
1e3f0 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42  + 2*nBlk - 1)/nB
1e400 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20  lk)*nBlk-1;.    
1e410 20 20 61 73 73 65 72 74 28 20 69 57 72 69 74 65    assert( iWrite
1e420 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b  >=buf.st_size );
1e430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1e440 69 57 72 69 74 65 2f 6e 42 6c 6b 29 3d 3d 28 28  iWrite/nBlk)==((
1e450 62 75 66 2e 73 74 5f 73 69 7a 65 2b 6e 42 6c 6b  buf.st_size+nBlk
1e460 2d 31 29 2f 6e 42 6c 6b 29 20 29 3b 0a 20 20 20  -1)/nBlk) );.   
1e470 20 20 20 61 73 73 65 72 74 28 20 28 28 69 57 72     assert( ((iWr
1e480 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20  ite+1)%nBlk)==0 
1e490 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e  );.      for(/*n
1e4a0 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e  o-op*/; iWrite<n
1e4b0 53 69 7a 65 3b 20 69 57 72 69 74 65 2b 3d 6e 42  Size; iWrite+=nB
1e4c0 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 57  lk ){.        nW
1e4d0 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rite = seekAndWr
1e4e0 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74  ite(pFile, iWrit
1e4f0 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  e, "", 1);.     
1e500 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
1e510 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e520 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1e530 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e540 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 28 6e 53  nWrite==0 || (nS
1e550 69 7a 65 25 6e 42 6c 6b 29 20 29 7b 0a 20 20 20  ize%nBlk) ){.   
1e560 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65       nWrite = se
1e570 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1e580 2c 20 6e 53 69 7a 65 2d 31 2c 20 22 22 2c 20 31  , nSize-1, "", 1
1e590 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1e5a0 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1e5b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1e5c0 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65  RITE;.      }.#e
1e5d0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
1e5e0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1e5f0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
1e600 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1e610 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70  Max>0 && nByte>p
1e620 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1e630 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1e640 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1e650 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20  hunk<=0 ){.     
1e660 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1e670 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1e680 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
1e690 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1e6a0 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1e6b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75          return u
1e6c0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1e6d0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1e6e0 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1e6f0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1e700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e710 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69    rc = unixMapfi
1e720 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29  le(pFile, nByte)
1e730 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1e740 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
1e750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
1e770 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  rg is initially 
1e780 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
1e790 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
1e7a0 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
1e7b0 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
1e7c0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1e7d0 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
1e7e0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1e7f0 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
1e800 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
1e810 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
1e820 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
1e830 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1e840 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
1e850 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74  void unixModeBit
1e860 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1e870 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
1e880 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
1e890 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
1e8a0 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
1e8b0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e8c0 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
1e8d0 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
1e8e0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
1e8f0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1e900 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
1e910 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1e920 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
1e930 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
1e940 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
1e950 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
1e960 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
1e970 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a  f, char *zBuf);.
1e980 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
1e990 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
1e9a0 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
1e9b0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1e9c0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
1e9d0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1e9e0 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
1e9f0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
1ea00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1ea10 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1ea20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1ea30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ea40 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1ea50 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1ea60 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1ea70 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1ea80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ea90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1eaa0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54  QLITE_FCNTL_LAST
1eab0 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
1eac0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1ead0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
1eae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1eaf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1eb00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1eb10 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
1eb20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1eb30 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
1eb40 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
1eb50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1eb60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1eb70 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1eb80 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  HINT: {.      in
1eb90 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75  t rc;.      Simu
1eba0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1ebb0 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
1ebc0 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70   fcntlSizeHint(p
1ebd0 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41  File, *(i64 *)pA
1ebe0 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  rg);.      Simul
1ebf0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1ec00 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (0);.      retur
1ec10 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1ec20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ec30 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
1ec40 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
1ec50 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
1ec60 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
1ec70 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1ec80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ec90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1eca0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ecb0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1ecc0 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  RITE: {.      un
1ecd0 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1ece0 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20   UNIXFILE_PSOW, 
1ecf0 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1ed00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ed10 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1ed20 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ed30 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  _VFSNAME: {.    
1ed40 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1ed50 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1ed60 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70  f("%s", pFile->p
1ed70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Vfs->zName);.   
1ed80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ed90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1eda0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1edb0 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b  _TEMPFILENAME: {
1edc0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46  .      char *zTF
1edd0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
1ede0 6c 6c 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56 66  lloc( pFile->pVf
1edf0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
1ee00 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c  .      if( zTFil
1ee10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  e ){.        uni
1ee20 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  xGetTempname(pFi
1ee30 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1ee40 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20  name, zTFile);. 
1ee50 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
1ee60 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
1ee70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1ee80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ee90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1eea0 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
1eeb0 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28  OVED: {.      *(
1eec0 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65  int*)pArg = file
1eed0 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b  HasMoved(pFile);
1eee0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1eef0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1ef00 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1ef10 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
1ef20 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ef30 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
1ef40 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
1ef50 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1ef60 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
1ef70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1ef80 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
1ef90 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1efa0 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
1efb0 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
1efc0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1efd0 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
1efe0 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
1eff0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
1f000 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
1f010 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
1f020 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
1f030 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
1f040 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
1f050 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
1f060 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1f070 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
1f080 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
1f090 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
1f0a0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55  .          unixU
1f0b0 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
1f0c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f0d0 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
1f0e0 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
1f0f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1f100 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f110 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1f120 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1f130 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
1f140 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
1f150 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
1f160 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
1f170 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
1f180 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1f190 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
1f1a0 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
1f1b0 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
1f1c0 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
1f1d0 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
1f1e0 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
1f1f0 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
1f200 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1f210 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1f220 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
1f230 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1f240 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
1f250 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
1f260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1f270 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1f280 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1f290 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1f2a0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1f2b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f2c0 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
1f2d0 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
1f2e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54  SQLITE_FCNTL_GET
1f2f0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
1f300 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1f310 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
1f320 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20  id,op,pArg);.   
1f330 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1f340 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1f350 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1f360 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
1f370 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
1f380 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
1f390 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f3a0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1f3b0 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
1f3c0 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
1f3d0 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
1f3e0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1f3f0 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
1f400 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
1f410 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
1f420 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
1f430 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
1f440 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
1f450 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
1f460 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
1f470 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
1f480 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
1f490 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
1f4a0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
1f4b0 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
1f4c0 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
1f4d0 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
1f4e0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
1f4f0 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
1f500 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
1f510 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
1f520 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58  */.#ifndef __QNX
1f530 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e  NTO__ .static in
1f540 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  t unixSectorSize
1f550 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
1f560 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
1f570 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1f580 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  sed);.  return S
1f590 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
1f5a0 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e  CTOR_SIZE;.}.#en
1f5b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
1f5c0 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e  ollowing version
1f5d0 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69   of unixSectorSi
1f5e0 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65  ze() is optimize
1f5f0 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69  d for QNX..*/.#i
1f600 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
1f610 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63  #include <sys/dc
1f620 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75  md_blk.h>.#inclu
1f630 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e  de <sys/statvfs.
1f640 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  h>.static int un
1f650 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
1f660 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
1f670 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1f680 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1f690 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  d;.  if( pFile->
1f6a0 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20  sectorSize == 0 
1f6b0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
1f6c0 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  atvfs fsInfo;.  
1f6d0 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74       .    /* Set
1f6e0 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f   defaults for no
1f6f0 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65  n-supported file
1f700 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70  systems */.    p
1f710 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f720 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
1f730 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
1f740 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1f750 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f760 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74  = 0;.    if( fst
1f770 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20  atvfs(pFile->h, 
1f780 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
1f790 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1f7a0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f7b0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
1f7c0 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
1f7d0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d  .f_basetype, "tm
1f7e0 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  p") ) {.      pF
1f7f0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f800 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1f810 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1f820 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f830 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
1f840 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f850 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20  IC4K |       /* 
1f860 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74  All ram filesyst
1f870 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
1f880 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1f890 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1f8a0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1f8b0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1f8c0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1f8d0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f900 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1f910 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
1f920 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1f930 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1f940 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1f950 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1f960 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f980 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1f990 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1f9a0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1f9b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73    }else if( strs
1f9c0 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  tr(fsInfo.f_base
1f9d0 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b  type, "etfs") ){
1f9e0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
1f9f0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
1fa00 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
1fa10 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1fa20 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1fa30 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20          /* etfs 
1fa40 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69  cluster size wri
1fa50 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
1fa60 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65  /.        (pFile
1fa70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
1fa80 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
1fa90 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20  P_ATOMIC512) |. 
1faa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1fab0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
1fac0 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
1fad0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1fae0 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
1fb20 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
1fb30 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fb40 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1fb50 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1fb60 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1fb70 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1fbb0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1fbc0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1fbd0 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1fbe0 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71  o.f_basetype, "q
1fbf0 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70  nx6") ){.      p
1fc00 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fc10 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1fc20 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1fc30 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1fc40 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1fc50 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1fc60 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a  MIC |         /*
1fc70 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20   All filesystem 
1fc80 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
1fc90 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
1fca0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1fcb0 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1fcc0 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1fcd0 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1fce0 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1fd10 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1fd20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1fd30 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1fd40 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
1fd50 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
1fd60 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
1fd70 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd90 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
1fda0 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
1fdb0 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
1fdc0 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
1fdd0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
1fde0 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20  pe, "qnx4") ){. 
1fdf0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
1fe00 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
1fe10 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
1fe20 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1fe30 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1fe40 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69        /* full bi
1fe50 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20  tset of atomics 
1fe60 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20  from max sector 
1fe70 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72  size and smaller
1fe80 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46   */.        ((pF
1fe90 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1fea0 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
1feb0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
1fec0 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20  << 1) - 2 |.    
1fed0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1fee0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1fef0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1ff00 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1ff10 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1ff50 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1ff60 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1ff70 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
1ff80 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73  f_basetype, "dos
1ff90 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
1ffa0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1ffb0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
1ffc0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1ffd0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1ffe0 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
1fff0 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61  full bitset of a
20000 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20  tomics from max 
20010 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20  sector size and 
20020 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20  smaller */.     
20030 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74     ((pFile->sect
20040 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
20050 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
20060 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32  IC512) << 1) - 2
20070 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   |.        SQLIT
20080 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
20090 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
200a0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
200b0 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
200c0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200e0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
200f0 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
20100 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
20110 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
20120 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
20130 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
20140 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20150 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20  ATOMIC512 |     
20160 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61   /* blocks are a
20170 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
20180 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
20190 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
201a0 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
201b0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
201c0 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
201f0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
20200 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  eds */.        0
20210 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
20220 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72   Last chance ver
20230 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74  ification.  If t
20240 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
20250 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20  sn't a multiple 
20260 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e  of 512.  ** then
20270 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e   it isn't valid.
20280 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
20290 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32  sectorSize % 512
202a0 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   != 0 ){.    pFi
202b0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
202c0 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
202d0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
202e0 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
202f0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
20300 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
20310 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
20320 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  e;.}.#endif /* _
20330 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a  _QNXNTO__ */../*
20340 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
20350 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
20360 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69  stics for the fi
20370 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56  le..**.** This V
20380 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20  FS is set up to 
20390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
203a0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
203b0 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75  ERWRITE by defau
203c0 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  lt..** However, 
203d0 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63  that choice is c
203e0 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e  ontroversial sin
203f0 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74  ce technically t
20400 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
20410 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65   file system doe
20420 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f  s not always pro
20430 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f  vide powersafe o
20440 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20  verwrites.  (In 
20450 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
20460 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f  after a power-lo
20470 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20  ss event, parts 
20480 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  of the file that
20490 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77   were never.** w
204a0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64  ritten might end
204b0 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65   up being altere
204c0 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f  d.)  However, no
204d0 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20  n-PSOW behavior 
204e0 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79  is very,.** very
204f0 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65   rare.  And asse
20500 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73  rting PSOW makes
20510 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69   a large reducti
20520 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74  on in the amount
20530 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20  .** of required 
20540 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69  I/O for journali
20550 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20  ng, since a lot 
20560 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c  of padding is el
20570 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65  iminated..**  He
20580 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52  nce, while POWER
20590 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69  SAFE_OVERWRITE i
205a0 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c  s on by default,
205b0 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65   there is a file
205c0 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69  -control.** avai
205d0 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
205e0 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65   off and URI que
205f0 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61  ry parameter ava
20600 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
20610 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  t off..*/.static
20620 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43   int unixDeviceC
20630 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
20640 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
20650 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
20660 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
20670 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
20680 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
20690 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72  .  if( p->sector
206a0 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65  Size==0 ) unixSe
206b0 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20  ctorSize(id);.  
206c0 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68  rc = p->deviceCh
206d0 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23  aracteristics;.#
206e0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63  endif.  if( p->c
206f0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
20700 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20  ILE_PSOW ){.    
20710 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43  rc |= SQLITE_IOC
20720 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
20730 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65  RWRITE;.  }.  re
20740 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
20750 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20760 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
20770 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
20780 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  E>0../*.** Retur
20790 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67  n the system pag
207a0 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
207b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
207c0 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
207d0 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68   directly by oth
207e0 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  er code in this 
207f0 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61  file. .** Instea
20800 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  d, it should be 
20810 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f  called via macro
20820 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29   osGetpagesize()
20830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20840 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28  unixGetpagesize(
20850 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e  void){.#if defin
20860 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a  ed(_BSD_SOURCE).
20870 20 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65    return getpage
20880 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20  size();.#else.  
20890 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63  return (int)sysc
208a0 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45  onf(_SC_PAGESIZE
208b0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e  );.#endif.}..#en
208c0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
208d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
208e0 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
208f0 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23  MAP_SIZE>0 */..#
20900 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20910 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62  IT_WAL../*.** Ob
20920 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
20930 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64  resent an shared
20940 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20   memory buffer. 
20950 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c   .**.** When mul
20960 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
20970 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
20980 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20  same wal-index, 
20990 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68  each thread.** h
209a0 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53  as its own unixS
209b0 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  hm object, but t
209c0 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f  hey all point to
209d0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
209e0 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e  ce.** of this un
209f0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
20a00 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
20a10 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65  s, each wal-inde
20a20 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  x is opened.** o
20a30 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
20a40 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  cess..**.** Each
20a50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20a60 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  ect is connected
20a70 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69   to a single uni
20a80 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
20a90 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63  t..** We could c
20aa0 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a  oalesce this obj
20ab0 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f  ect into unixIno
20ac0 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74  deInfo, but that
20ad0 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65   would mean.** e
20ae0 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74  very open file t
20af0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
20b00 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28   shared memory (
20b10 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
20b20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c  most.** open fil
20b30 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74  es) would have t
20b40 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74  o carry around t
20b50 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  his extra inform
20b60 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68  ation.  So.** th
20b70 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
20b80 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
20b90 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
20ba0 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
20bb0 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ject.** and the 
20bc0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20bd0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e  ct is created on
20be0 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a  ly when needed..
20bf0 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  **.** unixMutexH
20c00 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
20c10 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
20c20 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
20c30 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
20c40 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
20c50 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
20c60 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
20c70 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
20c80 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
20c90 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
20ca0 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
20cb0 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
20cc0 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
20cd0 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
20ce0 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
20cf0 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ther unixShmNode
20d00 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
20d10 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f  eld or unixShmNo
20d20 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
20d30 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  * unixMutexHeld(
20d40 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
20d50 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
20d60 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
20d70 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
20d80 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
20d90 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a  t unixShmNode {.
20da0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
20db0 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  *pInode;     /* 
20dc0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68  unixInodeInfo th
20dd0 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d  at owns this SHM
20de0 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   node */.  sqlit
20df0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
20e00 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
20e10 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
20e20 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
20e30 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
20e40 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
20e50 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  the mmapped file
20e60 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
20e90 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
20ea0 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
20eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20ec0 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
20ed0 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75  y regions */.  u
20ee0 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  16 nRegion;     
20ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20f00 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
20f10 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65  ion */.  u8 isRe
20f20 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adonly;         
20f30 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
20f40 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68  ead-only */.  ch
20f50 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20  ar **apRegion;  
20f60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
20f70 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72  y of mapped shar
20f80 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
20f90 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
20fc0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
20fd0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
20fe0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46  */.  unixShm *pF
20ff0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
21000 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f  /* All unixShm o
21010 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
21020 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65  to this */.#ifde
21030 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21040 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20   u8 exclMask;   
21050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21060 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
21070 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
21080 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20   u8 sharedMask; 
21090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
210a0 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
210b0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
210c0 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
210d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
210e0 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53   available unixS
210f0 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
21100 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
21110 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
21120 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
21130 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
21140 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
21150 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
21160 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
21170 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
21180 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
21190 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
211a0 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
211b0 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
211c0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
211d0 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
211e0 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65     unixShm.pFile
211f0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69  .**    unixShm.i
21200 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
21210 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
21220 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e  d/write.  The un
21230 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74  ixShm.pFile->mut
21240 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
21250 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
21260 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
21270 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
21280 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20  uct unixShm {.  
21290 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
212a0 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68  mNode;     /* Th
212b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69  e underlying uni
212c0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
212d0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e  */.  unixShm *pN
212e0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
212f0 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20  /* Next unixShm 
21300 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e  with the same un
21310 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
21320 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
21330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21340 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
21350 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74   unixShmNode mut
21360 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20  ex */.  u8 id;  
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
21390 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
213a0 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
213b0 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  de */.  u16 shar
213c0 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
213d0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
213e0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
213f0 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
21400 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
21410 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
21420 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
21430 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  */.};../*.** Con
21440 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
21450 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
21460 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  ne UNIX_SHM_BASE
21470 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
21480 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
21490 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
214a0 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
214b0 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20  ne UNIX_SHM_DMS 
214c0 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53     (UNIX_SHM_BAS
214d0 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
214e0 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
214f0 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
21500 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
21510 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
21520 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  all bytes from o
21530 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74  fst through ofst
21540 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b  +n-1..**.** Lock
21550 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d  s block if the m
21560 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55  ask is exactly U
21570 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72  NIX_SHM_C and ar
21580 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  e non-blocking.*
21590 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
215a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
215b0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
215c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
215d0 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20  mNode, /* Apply 
215e0 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
215f0 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
21600 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
21610 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
21620 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
21630 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
21640 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
21650 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
21660 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
21670 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
21680 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
216b0 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
216c0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
216d0 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  f;       /* The 
216e0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
216f0 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
21700 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
21710 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52  QLITE_OK;   /* R
21720 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
21730 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
21740 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
21750 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
21760 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
21770 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
21780 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21790 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53  e3_mutex_held(pS
217a0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c  hmNode->mutex) |
217b0 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  | pShmNode->nRef
217c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61  ==0 );..  /* Sha
217d0 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20  red locks never 
217e0 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  span more than o
217f0 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73  ne byte */.  ass
21800 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63  ert( n==1 || loc
21810 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29  kType!=F_RDLCK )
21820 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72  ;..  /* Locks ar
21830 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a  e within range *
21840 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  /.  assert( n>=1
21850 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d   && n<SQLITE_SHM
21860 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  _NLOCK );..  if(
21870 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
21880 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
21890 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
218a0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
218b0 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c     memset(&f, 0,
218c0 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20   sizeof(f));.   
218d0 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b   f.l_type = lock
218e0 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68  Type;.    f.l_wh
218f0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
21900 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d  .    f.l_start =
21910 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c   ofst;.    f.l_l
21920 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20  en = n;..    rc 
21930 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  = osFcntl(pShmNo
21940 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  de->h, F_SETLK, 
21950 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72  &f);.    rc = (r
21960 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54  c!=(-1)) ? SQLIT
21970 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55  E_OK : SQLITE_BU
21980 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  SY;.  }..  /* Up
21990 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  date the global 
219a0 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64  lock state and d
219b0 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20  o debug tracing 
219c0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
219d0 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d  _DEBUG.  { u16 m
219e0 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ask;.  OSTRACE((
219f0 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20  "SHM-LOCK "));. 
21a00 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20   mask = ofst>31 
21a10 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28  ? 0xffff : (1<<(
21a20 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
21a30 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  fst);.  if( rc==
21a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21a50 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
21a60 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
21a70 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
21a80 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
21a90 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21aa0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
21ab0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
21ac0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
21ad0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  = ~mask;.    }el
21ae0 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
21af0 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
21b00 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
21b10 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
21b20 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
21b30 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
21b40 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
21b50 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
21b60 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
21b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
21b80 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
21b90 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
21ba0 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
21bb0 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
21bc0 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
21bd0 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c  Node->exclMask |
21be0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53  = mask;.      pS
21bf0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
21c00 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
21c10 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
21c20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
21c30 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
21c40 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
21c50 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74  %d failed", ofst
21c60 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ));.    }else if
21c70 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44  ( lockType==F_RD
21c80 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
21c90 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b  RACE(("read-lock
21ca0 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20   failed"));.    
21cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
21cc0 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
21cd0 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
21ce0 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
21cf0 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c  lock %d failed",
21d00 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20   ofst));.    }. 
21d10 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20   }.  OSTRACE((" 
21d20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33  - afterwards %03
21d30 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  x,%03x\n",.     
21d40 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21d50 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d  sharedMask, pShm
21d60 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  Node->exclMask))
21d70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
21d80 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20  return rc;      
21d90 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75    .}../*.** Retu
21da0 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e  rn the minimum n
21db0 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68  umber of 32KB sh
21dc0 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73  m regions that s
21dd0 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20  hould be mapped 
21de0 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73  at.** a time, as
21df0 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68  suming that each
21e00 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
21e10 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
21e20 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  iple of the.** c
21e30 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61  urrent system pa
21e40 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55  ge-size..**.** U
21e50 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
21e60 31 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  1. The exception
21e70 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73   seems to be sys
21e80 74 65 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f  tems that are co
21e90 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75  nfigured.** to u
21ea0 73 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20  se 64KB pages - 
21eb0 69 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63  in this case eac
21ec0 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63  h mapping must c
21ed0 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20 74 77  over at least tw
21ee0 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73  o.** shm regions
21ef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21f00 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72  unixShmRegionPer
21f10 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  Map(void){.  int
21f20 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34   shmsz = 32*1024
21f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21f40 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20  SHM region size 
21f50 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
21f60 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b  osGetpagesize();
21f70 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67     /* System pag
21f80 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65  e size */.  asse
21f90 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67  rt( ((pgsz-1)&pg
21fa0 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50  sz)==0 );   /* P
21fb0 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
21fc0 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f   a power of 2 */
21fd0 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73  .  if( pgsz<shms
21fe0 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  z ) return 1;.  
21ff0 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73  return pgsz/shms
22000 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67  z;.}../*.** Purg
22010 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  e the unixShmNod
22020 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c  eList list of al
22030 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75  l entries with u
22040 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
22050 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
22060 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
22070 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
22080 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
22090 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
220a0 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
220b0 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
220c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
220d0 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75  d unixShmPurge(u
220e0 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
220f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20   unixShmNode *p 
22100 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  = pFd->pInode->p
22110 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
22120 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
22130 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  () );.  if( p &&
22140 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
22150 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61     int nShmPerMa
22160 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  p = unixShmRegio
22170 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69  nPerMap();.    i
22180 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
22190 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64  ( p->pInode==pFd
221a0 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ->pInode );.    
221b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
221c0 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
221d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
221e0 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d  nRegion; i+=nShm
221f0 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69  PerMap){.      i
22200 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
22210 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
22220 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70  ->apRegion[i], p
22230 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->szRegion);.   
22240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22250 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22260 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a  ->apRegion[i]);.
22270 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22280 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22290 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->apRegion);.   
222a0 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
222b0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
222c0 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f  se(pFd, p->h, __
222d0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70  LINE__);.      p
222e0 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ->h = -1;.    }.
222f0 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
22300 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
22310 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
22320 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
22330 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  pen a shared-mem
22340 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
22350 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61  ted with open da
22360 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
22370 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72  d.  .** This par
22380 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e  ticular implemen
22390 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70  tation uses mmap
223a0 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
223b0 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74   The file used t
223c0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72  o implement shar
223d0 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20  ed-memory is in 
223e0 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
223f0 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65  ry.** as the ope
22400 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
22410 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
22420 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65   name as the ope
22430 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  n database.** fi
22440 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68  le with the "-sh
22450 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e  m" suffix added.
22460 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
22470 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22480 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65  ile.** is "/home
22490 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
224a0 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  " then the file 
224b0 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
224c0 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66  and mmapped.** f
224d0 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
224e0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
224f0 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
22500 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a  fig.db-shm".  .*
22510 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70  *.** Another app
22520 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75  roach to is to u
22530 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76  se files in /dev
22540 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70  /shm or /dev/tmp
22550 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f   or an.** some o
22560 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74  ther tmpfs mount
22570 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20  . But if a file 
22580 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  in a different d
22590 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d  irectory.** from
225a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
225b0 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
225c0 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73   differing acces
225d0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  s permissions.**
225e0 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d   or a chroot() m
225f0 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64  ight cause two d
22600 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
22610 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  es on the same.*
22620 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e  * database to en
22630 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65  d up using diffe
22640 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73  rent files for s
22650 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a  hared memory - .
22660 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  ** meaning that 
22670 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75  their memory wou
22680 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  ld not really be
22690 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74   shared - result
226a0 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61  ing.** in databa
226b0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
226c0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68  Nevertheless, th
226d0 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73  is tmpfs file us
226e0 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e  age.** can be en
226f0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
22700 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51  -time using -DSQ
22710 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22720 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a  RY="/dev/shm".**
22730 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65   or the equivale
22740 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  nt.  The use of 
22750 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  the SQLITE_SHM_D
22760 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
22770 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20  -time.** option 
22780 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e  results in an in
22790 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64  compatible build
227a0 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69   of SQLite;  bui
227b0 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a  lds of SQLite.**
227c0 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65   that with diffe
227d0 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ring SQLITE_SHM_
227e0 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e  DIRECTORY settin
227f0 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  gs attempt to us
22800 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61  e the.** same da
22810 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
22820 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61  he same time, da
22830 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
22840 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  n will likely.**
22850 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c   result. The SQL
22860 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22870 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  Y compile-time o
22880 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ption is conside
22890 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72  red.** "unsuppor
228a0 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20  ted" and may go 
228b0 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65  away in a future
228c0 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e   SQLite release.
228d0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
228e0 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
228f0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
22900 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
22910 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
22920 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
22930 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
22940 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
22950 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
22960 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
22970 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
22980 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
22990 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
229a0 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  der cleared..**.
229b0 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  ** If the origin
229c0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
229d0 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e   (pDbFd) is usin
229e0 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c  g the "unix-excl
229f0 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65  " VFS.** that me
22a00 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c  ans that an excl
22a10 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65  usive lock is he
22a20 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
22a30 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  se file and.** t
22a40 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
22a50 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20  cesses are able 
22a60 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
22a70 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
22a80 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c  In.** that case,
22a90 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c   we do not reall
22aa0 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65  y need shared me
22ab0 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64  mory.  No shared
22ac0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20   memory.** file 
22ad0 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
22ae0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
22af0 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64  ill be simulated
22b00 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72   with heap memor
22b10 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
22b20 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
22b30 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
22b40 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
22b50 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
22b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22b70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
22b80 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
22b90 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
22ba0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
22bb0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
22bc0 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
22bd0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
22c00 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
22c10 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
22c20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
22c30 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
22c40 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  ar *zShmFilename
22c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22c60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
22c70 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a  e used for SHM *
22c80 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65  /.  int nShmFile
22c90 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
22ca0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
22cb0 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20  he SHM filename 
22cc0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
22cd0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
22ce0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
22cf0 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  xShm object. */.
22d00 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
22d10 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
22d20 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
22d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22d40 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
22d50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
22d60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
22d70 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
22d80 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
22d90 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
22da0 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
22db0 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
22dc0 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
22dd0 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
22de0 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
22df0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
22e00 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
22e10 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
22e20 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
22e30 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
22e40 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
22e50 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
22e60 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
22e70 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e90 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
22ea0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
22eb0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22ec0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
22ed0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
22ee0 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64  BasePath = pDbFd
22ef0 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a  ->zPath;.#endif.
22f00 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74  .    /* Call fst
22f10 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  at() to figure o
22f20 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ut the permissio
22f30 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ns on the databa
22f40 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20  se file. If.    
22f50 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66  ** a new *-shm f
22f60 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
22f70 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20  an attempt will 
22f80 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74  be made to creat
22f90 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68  e it.    ** with
22fa0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
22fb0 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  sions..    */.  
22fc0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44    if( osFstat(pD
22fd0 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  bFd->h, &sStat) 
22fe0 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  && pInode->bProc
22ff0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
23000 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23010 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
23020 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
23030 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  _err;.    }..#if
23040 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
23050 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68  IRECTORY.    nSh
23060 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65  mFilename = size
23070 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  of(SQLITE_SHM_DI
23080 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23  RECTORY) + 31;.#
23090 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c  else.    nShmFil
230a0 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74  ename = 6 + (int
230b0 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74  )strlen(zBasePat
230c0 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
230d0 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
230e0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
230f0 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
23100 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
23110 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
23120 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
23130 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23140 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
23150 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
23160 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
23170 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
23180 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e  mNode)+nShmFilen
23190 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69  ame);.    zShmFi
231a0 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64  lename = pShmNod
231b0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  e->zFilename = (
231c0 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b  char*)&pShmNode[
231d0 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
231e0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
231f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
23200 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
23210 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
23220 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
23230 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48         SQLITE_SH
23240 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71  M_DIRECTORY "/sq
23250 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c  lite-shm-%x-%x",
23260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23270 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74        (u32)sStat
23280 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53  .st_ino, (u32)sS
23290 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c  tat.st_dev);.#el
232a0 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  se.    sqlite3_s
232b0 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
232c0 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
232d0 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42  me, "%s-shm", zB
232e0 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71  asePath);.    sq
232f0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
23300 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a  (pDbFd->zPath, z
23310 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65  ShmFilename);.#e
23320 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
23330 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70  e->h = -1;.    p
23340 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
23350 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
23360 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
23370 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d  >pInode = pDbFd-
23380 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68  >pInode;.    pSh
23390 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73  mNode->mutex = s
233a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
233b0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
233c0 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70  FAST);.    if( p
233d0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
233e0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
233f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23400 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
23410 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
23420 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
23430 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
23440 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46  .      int openF
23450 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
23460 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69  O_CREAT;.      i
23470 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
23480 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50  oolean(pDbFd->zP
23490 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73  ath, "readonly_s
234a0 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  hm", 0) ){.     
234b0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
234c0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  _RDONLY;.       
234d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
234e0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
234f0 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
23500 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70  e->h = robust_op
23510 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  en(zShmFilename,
23520 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74   openFlags, (sSt
23530 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  at.st_mode&0777)
23540 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
23550 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
23560 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
23570 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
23580 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
23590 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  pen", zShmFilena
235a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
235b0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
235c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
235d0 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
235e0 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
235f0 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20  root, make sure 
23600 74 68 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c  that the SHM fil
23610 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77  e.      ** is ow
23620 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
23630 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74  user that owns t
23640 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
23650 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  base.  Otherwise
23660 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  ,.      ** the o
23670 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69  riginal owner wi
23680 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
23690 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20  o connect..     
236a0 20 2a 2f 0a 20 20 20 20 20 20 6f 73 46 63 68 6f   */.      osFcho
236b0 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
236c0 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
236d0 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a  tat.st_gid);.  .
236e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
236f0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
23700 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
23710 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
23720 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
23730 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
23740 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
23750 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
23760 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
23770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23780 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
23790 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
237a0 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
237b0 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
237c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
237d0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
237e0 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
237f0 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
23800 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
23810 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23820 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72  RR_SHMOPEN, "ftr
23830 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c  uncate", zShmFil
23840 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
23850 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23870 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
23880 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
23890 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
238a0 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  RDLCK, UNIX_SHM_
238b0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  DMS, 1);.      }
238c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
238d0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
238e0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
238f0 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
23900 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
23910 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68  ld of the unixSh
23920 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
23930 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
23940 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
23950 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
23960 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
23970 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
23980 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
23990 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
239a0 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
239b0 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
239c0 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
239d0 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
239e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
239f0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
23a00 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
23a10 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74  r of the unixEnt
23a20 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
23a30 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
23a40 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
23a50 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68  w (struct unixSh
23a60 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
23a70 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
23a80 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
23a90 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
23aa0 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
23ab0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
23ac0 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
23ad0 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
23ae0 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
23af0 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
23b00 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
23b10 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
23b20 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20  de->mutex .  ** 
23b30 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
23b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
23b50 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
23b60 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
23b70 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
23b80 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
23b90 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
23ba0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
23bb0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
23bc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23bd0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
23be0 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
23bf0 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
23c00 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
23c10 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
23c20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
23c30 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
23c40 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
23c50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
23c60 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
23c70 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
23c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23c90 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
23ca0 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
23cb0 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
23cc0 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
23cd0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
23ce0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
23cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23d00 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
23d10 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
23d20 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
23d30 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
23d40 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
23d50 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
23d60 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
23d70 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
23d80 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
23d90 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
23da0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
23db0 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
23dc0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
23dd0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
23de0 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
23df0 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
23e00 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
23e10 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
23e20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
23e30 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
23e40 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
23e50 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
23e60 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
23e70 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
23e80 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
23e90 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
23ea0 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
23eb0 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
23ec0 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
23ed0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
23ee0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
23ef0 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
23f00 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
23f10 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
23f20 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
23f30 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
23f40 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
23f50 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
23f60 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
23f70 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
23f80 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
23f90 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
23fa0 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
23fb0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
23fc0 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
23fd0 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
23fe0 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
23ff0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
24000 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
24010 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
24020 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24040 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
24050 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24070 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
24080 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24090 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
240c0 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
240d0 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
240f0 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
24100 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
24110 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
24120 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
24130 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
24140 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
24150 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
24160 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
24170 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
24180 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
24190 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
241a0 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
241b0 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
241c0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
241d0 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
241e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
241f0 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
24200 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
24210 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52  p();.  int nReqR
24220 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  egion;..  /* If 
24230 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
24240 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
24250 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
24260 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
24270 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
24280 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
24290 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
242a0 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
242b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
242c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
242d0 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
242e0 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
242f0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
24300 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
24310 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
24320 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
24330 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
24340 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
24350 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
24360 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61  Region==0 );.  a
24370 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
24380 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
24390 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
243a0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
243b0 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
243c0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
243d0 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
243e0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
243f0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
24400 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
24410 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d  0 );..  /* Minim
24420 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67  um number of reg
24430 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f  ions required to
24440 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20   be mapped. */. 
24450 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28 28   nReqRegion = ((
24460 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d  iRegion+nShmPerM
24470 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70  ap) / nShmPerMap
24480 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a  ) * nShmPerMap;.
24490 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
244a0 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
244b0 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ion ){.    char 
244c0 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20  **apNew;        
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
244e0 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20   New apRegion[] 
244f0 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
24500 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65 67   nByte = nReqReg
24510 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20  ion*szRegion;   
24520 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
24530 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
24540 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
24550 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
24560 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
24570 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20  by fstat() */.. 
24580 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
24590 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
245a0 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ;..    if( pShmN
245b0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
245c0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
245d0 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
245e0 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
245f0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
24600 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
24610 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
24620 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
24630 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
24640 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
24650 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20  x file is.      
24660 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
24670 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
24680 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
24690 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
246a0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68   if( osFstat(pSh
246b0 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74  mNode->h, &sStat
246c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
246d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
246e0 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  HMSIZE;.        
246f0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
24710 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f     if( sStat.st_
24720 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20  size<nByte ){.  
24730 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
24740 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
24750 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
24760 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20  ist. If bExtend 
24770 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
24780 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74    ** false, exit
24790 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
247a0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
247b0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
247c0 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20  turned..        
247d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
247e0 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20 20  bExtend ){.     
247f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24800 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
24810 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 74  ..        /* Alt
24820 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62  ernatively, if b
24830 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20  Extend is true, 
24840 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e  extend the file.
24850 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20 20   Do this by.    
24860 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 61      ** writing a
24870 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
24880 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20  the end of each 
24890 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67 0a  (OS) page being.
248a0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
248b0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
248c0 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  . Technically, w
248d0 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69 74  e need only writ
248e0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  e to the.       
248f0 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 6e   ** last page in
24900 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e 64   order to extend
24910 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20 77   the file. But w
24920 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65  riting to all ne
24930 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
24940 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f 53  es forces the OS
24950 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
24960 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77  m immediately, w
24970 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20 20  hich reduces.   
24980 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61 6e       ** the chan
24990 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77 68  ces of SIGBUS wh
249a0 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ile accessing th
249b0 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
249c0 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20  later on..      
249d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c 73    */.        els
249e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  e{.          sta
249f0 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70 67  tic const int pg
24a00 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 20  sz = 4096;.     
24a10 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20       int iPg;.. 
24a20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
24a30 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
24a40 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c 79  te of each newly
24a50 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78   allocated or ex
24a60 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a 20  tended page */. 
24a70 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
24a80 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29 3d   (nByte % pgsz)=
24a90 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
24aa0 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e 73  for(iPg=(sStat.s
24ab0 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50  t_size/pgsz); iP
24ac0 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20  g<(nByte/pgsz); 
24ad0 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPg++){.        
24ae0 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57      if( seekAndW
24af0 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d  riteFd(pShmNode-
24b00 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70  >h, iPg*pgsz + p
24b10 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 30 29  gsz-1, "", 1, 0)
24b20 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=1 ){.         
24b30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24b40 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64  *zFile = pShmNod
24b50 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  e->zFilename;.  
24b60 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
24b70 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
24b80 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
24b90 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69  ZE, "write", zFi
24ba0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  le);.           
24bb0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
24bc0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  out;.           
24bd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
24be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24bf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
24c00 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
24c10 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
24c20 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
24c30 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
24c40 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
24c50 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
24c60 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
24c70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
24c80 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f  egion, nReqRegio
24c90 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  n*sizeof(char *)
24ca0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
24cb0 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
24cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
24cd0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
24ce0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24cf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
24d00 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20  ode->apRegion = 
24d10 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65  apNew;.    while
24d20 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
24d30 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29  ion<nReqRegion )
24d40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70  {.      int nMap
24d50 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d   = szRegion*nShm
24d60 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e  PerMap;.      in
24d70 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  t i;.      void 
24d80 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  *pMem;.      if(
24d90 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
24da0 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  ){.        pMem 
24db0 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70  = osMmap(0, nMap
24dc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ,.            pS
24dd0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
24de0 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a  ly ? PROT_READ :
24df0 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f   PROT_READ|PROT_
24e00 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20  WRITE, .        
24e10 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20      MAP_SHARED, 
24e20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52  pShmNode->h, szR
24e30 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e  egion*(i64)pShmN
24e40 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20  ode->nRegion.   
24e50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
24e60 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41  if( pMem==MAP_FA
24e70 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
24e80 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
24e90 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
24ea0 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c  _SHMMAP, "mmap",
24eb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
24ec0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
24ed0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24ee0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
24ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24f00 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33    pMem = sqlite3
24f10 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e  _malloc(szRegion
24f20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
24f30 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
24f40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24f50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
24f60 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24f70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
24f80 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
24f90 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
24fa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
24fb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65  or(i=0; i<nShmPe
24fc0 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rMap; i++){.    
24fd0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
24fe0 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
24ff0 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28  >nRegion+i] = &(
25000 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52  (char*)pMem)[szR
25010 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20  egion*i];.      
25020 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
25030 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68  ->nRegion += nSh
25040 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20  mPerMap;.    }. 
25050 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
25060 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
25070 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
25080 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
25090 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
250a0 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
250b0 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
250c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
250d0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
250e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
250f0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
25100 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
25110 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
25120 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25130 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25140 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
25150 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
25160 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
25170 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
25180 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
25190 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
251a0 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
251b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
251c0 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
251d0 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
251e0 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
251f0 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
25200 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
25210 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
25220 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
25230 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
25240 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
25250 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
25260 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
25270 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
25280 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
25290 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
252a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
252b0 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
252c0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
252d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
252e0 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
252f0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
25300 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
25330 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
25340 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
25350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25360 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25370 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
25380 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
25390 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
253b0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
253c0 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
253d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
253e0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
253f0 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
25400 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
25410 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
25420 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
25430 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
25440 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
25450 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
25460 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
25470 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25490 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
254a0 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
254b0 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
254c0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
254d0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
254e0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
254f0 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
25500 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25510 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
25520 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
25530 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
25540 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25560 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
25570 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
25580 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
25590 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
255a0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
255b0 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
255c0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
255d0 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
255e0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
255f0 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
25600 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
25610 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
25620 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
25630 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
25640 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
25650 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
25660 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
25670 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
25680 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
25690 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
256a0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
256b0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
256c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
256d0 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
256e0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
256f0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
25700 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
25710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
25720 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
25730 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
25740 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  VE)!=0 );.  asse
25750 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
25760 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
25770 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
25780 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
25790 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
257a0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
257b0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
257c0 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
257d0 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
257e0 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
257f0 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
25800 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
25810 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
25820 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
25830 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
25840 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
25850 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
25860 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
25870 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
25880 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
25890 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
258a0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
258b0 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
258c0 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
258d0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
258e0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
258f0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
25900 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
25910 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25920 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
25930 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
25940 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
25950 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
25960 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
25970 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
25980 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
25990 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
259a0 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
259b0 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
259c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
259d0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
259e0 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b  ShmNode, F_UNLCK
259f0 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
25a00 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
25a10 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
25a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
25a30 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
25a40 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
25a50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25a70 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
25a80 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
25a90 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
25aa0 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
25ab0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
25ac0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
25ad0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
25ae0 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
25af0 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
25b00 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
25b10 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
25b20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
25b30 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
25b40 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
25b50 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
25b60 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
25b70 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
25b80 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
25b90 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
25ba0 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
25bb0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
25bc0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
25bd0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
25be0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
25bf0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
25c00 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
25c10 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
25c20 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
25c30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25c40 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
25c50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25c60 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
25c70 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
25c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
25c90 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
25ca0 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
25cb0 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
25cc0 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
25cd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25ce0 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
25cf0 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
25d00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
25d10 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
25d20 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
25d30 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
25d40 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
25d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25d60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25d70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25d80 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
25d90 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
25da0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25db0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25dc0 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
25dd0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
25de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25df0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
25e00 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
25e10 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
25e20 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
25e30 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
25e40 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
25e50 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
25e60 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
25e70 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25e80 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25e90 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25ea0 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
25eb0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
25ec0 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
25ed0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
25ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25ef0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
25f00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25f10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
25f20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
25f30 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
25f40 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
25f50 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
25f60 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
25f70 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
25f80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
25f90 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
25fa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25fc0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
25fd0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
25fe0 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  de, F_WRLCK, ofs
25ff0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
26000 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
26010 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26030 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
26040 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
26050 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
26060 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
26070 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
26080 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
26090 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
260a0 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
260b0 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
260c0 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
260d0 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
260e0 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
260f0 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65  tpid(), p->share
26100 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
26110 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
26120 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
26130 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
26140 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
26150 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
26160 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
26170 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
26180 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
26190 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
261a0 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
261b0 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
261c0 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
261d0 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
261e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
261f0 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
26200 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
26210 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
26220 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
26230 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
26240 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
26250 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
26260 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e  AMETER(fd);.  un
26270 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
26280 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
26290 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
262a0 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
262b0 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
262c0 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
262d0 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
262e0 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
262f0 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
26300 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
26310 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
26320 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
26330 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
26340 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
26350 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
26360 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
26370 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
26380 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
26390 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
263a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
263b0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
263c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
263d0 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
263e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
263f0 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
26400 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
26410 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26430 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
26440 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
26450 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
26460 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
26470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
26480 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
26490 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
264a0 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264c0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
264d0 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
264e0 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
264f0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26510 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
26520 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
26530 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
26540 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
26550 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
26560 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
26570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
26580 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
26590 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
265a0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
265b0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
265c0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
265d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
265e0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
265f0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
26600 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
26610 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
26620 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
26630 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
26640 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
26650 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
26660 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
26670 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
26680 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
26690 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
266a0 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
266b0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
266c0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
266d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
266e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
266f0 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
26700 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
26710 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
26720 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
26730 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
26740 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
26750 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
26760 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
26770 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
26780 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
26790 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
267a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
267b0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
267c0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
267d0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
267e0 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
267f0 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
26800 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
26810 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  h>=0 ){.      os
26820 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
26830 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
26840 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75   }.    unixShmPu
26850 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
26860 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
26870 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
26880 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
26890 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
268a0 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
268b0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
268c0 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
268d0 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
268e0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
268f0 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
26900 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
26910 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
26920 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
26930 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
26940 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65  * If it is curre
26950 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ntly memory mapp
26960 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70  ed, unmap file p
26970 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Fd..*/.static vo
26980 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
26990 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
269a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
269b0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
269c0 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
269d0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d  egion ){.    osM
269e0 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52  unmap(pFd->pMapR
269f0 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70  egion, pFd->mmap
26a00 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20  SizeActual);.   
26a10 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
26a20 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
26a30 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
26a40 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
26a50 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tual = 0;.  }.}.
26a60 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
26a70 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f  o set the size o
26a80 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  f the memory map
26a90 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20  ping maintained 
26aa0 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63  by file .** desc
26ab0 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e  riptor pFd to nN
26ac0 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78  ew bytes. Any ex
26ad0 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
26ae0 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a  s discarded..**.
26af0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
26b00 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
26b10 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sets the followi
26b20 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a  ng variables:.**
26b30 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
26b40 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a  le.pMapRegion.**
26b50 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
26b60 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20  mmapSize.**     
26b70 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
26b80 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20  izeActual.**.** 
26b90 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  If unsuccessful,
26ba0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
26bb0 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20  e is logged via 
26bc0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e  sqlite3_log() an
26bd0 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76  d.** the three v
26be0 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61  ariables above a
26bf0 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68  re zeroed. In th
26c00 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73  is case SQLite s
26c10 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75  hould.** continu
26c20 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
26c30 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
26c40 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78  he xRead() and x
26c50 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f  Write().** metho
26c60 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
26c70 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65  id unixRemapfile
26c80 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
26c90 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
26ca0 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
26cb0 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  riptor object */
26cc0 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20  .  i64 nNew     
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d     /* Required m
26cf0 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29  apping size */.)
26d00 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
26d10 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20  zErr = "mmap";. 
26d20 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b   int h = pFd->h;
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
26d50 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
26d60 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38   db file */.  u8
26d70 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29   *pOrig = (u8 *)
26d80 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b  pFd->pMapRegion;
26d90 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
26da0 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61   current file ma
26db0 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e  pping */.  i64 n
26dc0 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Orig = pFd->mmap
26dd0 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
26de0 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67  /* Size of pOrig
26df0 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73   region in bytes
26e00 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d   */.  u8 *pNew =
26e10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
26e30 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61  cation of new ma
26e40 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66  pping */.  int f
26e50 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44  lags = PROT_READ
26e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26e70 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
26e80 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20   to mmap() */.. 
26e90 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
26ea0 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
26eb0 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64  assert( nNew>pFd
26ec0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
26ed0 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46  assert( nNew<=pF
26ee0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
26ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
26f00 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
26f10 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
26f20 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  ual>=pFd->mmapSi
26f30 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
26f40 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b  MAP_FAILED!=0 );
26f50 0a 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74  ..  if( (pFd->ct
26f60 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
26f70 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20  LE_RDONLY)==0 ) 
26f80 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52  flags |= PROT_WR
26f90 49 54 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69  ITE;..  if( pOri
26fa0 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52  g ){.#if HAVE_MR
26fb0 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65  EMAP.    i64 nRe
26fc0 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  use = pFd->mmapS
26fd0 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63  ize;.#else.    c
26fe0 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61  onst int szSyspa
26ff0 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69  ge = osGetpagesi
27000 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52  ze();.    i64 nR
27010 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61  euse = (pFd->mma
27020 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70  pSize & ~(szSysp
27030 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  age-1));.#endif.
27040 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26      u8 *pReq = &
27050 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a  pOrig[nReuse];..
27060 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79      /* Unmap any
27070 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78   pages of the ex
27080 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74  isting mapping t
27090 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  hat cannot be re
270a0 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  used. */.    if(
270b0 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29   nReuse!=nOrig )
270c0 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70  {.      osMunmap
270d0 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65  (pReq, nOrig-nRe
270e0 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  use);.    }..#if
270f0 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
27100 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70   pNew = osMremap
27110 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20  (pOrig, nReuse, 
27120 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59  nNew, MREMAP_MAY
27130 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20  MOVE);.    zErr 
27140 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73  = "mremap";.#els
27150 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  e.    pNew = osM
27160 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e  map(pReq, nNew-n
27170 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41  Reuse, flags, MA
27180 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65  P_SHARED, h, nRe
27190 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  use);.    if( pN
271a0 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew!=MAP_FAILED )
271b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  {.      if( pNew
271c0 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20  !=pReq ){.      
271d0 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c    osMunmap(pNew,
271e0 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b   nNew - nReuse);
271f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
27200 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
27210 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
27220 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Orig;.      }.  
27230 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
27240 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74  /* The attempt t
27250 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69  o extend the exi
27260 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61  sting mapping fa
27270 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a  iled. Free it. *
27280 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  /.    if( pNew==
27290 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e  MAP_FAILED || pN
272a0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  ew==0 ){.      o
272b0 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e  sMunmap(pOrig, n
272c0 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Reuse);.    }.  
272d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20  }..  /* If pNew 
272e0 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74  is still NULL, t
272f0 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ry to create an 
27300 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70  entirely new map
27310 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ping. */.  if( p
27320 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  New==0 ){.    pN
27330 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e  ew = osMmap(0, n
27340 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  New, flags, MAP_
27350 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20  SHARED, h, 0);. 
27360 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   }..  if( pNew==
27370 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
27380 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
27390 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e  nNew = 0;.    un
273a0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
273b0 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d  E_OK, zErr, pFd-
273c0 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a  >zPath);..    /*
273d0 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61   If the mmap() a
273e0 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73  bove failed, ass
273f0 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ume that all sub
27400 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63  sequent mmap() c
27410 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  alls.    ** will
27420 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74   probably fail t
27430 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f  oo. Fall back to
27440 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
27450 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a  ite exclusively.
27460 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63      ** in this c
27470 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64  ase.  */.    pFd
27480 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
27490 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d  0;.  }.  pFd->pM
274a0 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64  apRegion = (void
274b0 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e   *)pNew;.  pFd->
274c0 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e  mmapSize = pFd->
274d0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
274e0 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nNew;.}../*.** 
274f0 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65  Memory map or re
27500 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65  map the file ope
27510 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63  ned by file-desc
27520 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74  riptor pFd (if t
27530 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c  he file.** is al
27540 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68  ready mapped, th
27550 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
27560 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  ng is replaced b
27570 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20  y the new). Or, 
27580 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72  if .** there alr
27590 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61  eady exists a ma
275a0 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66  pping for this f
275b0 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
275c0 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74  re still .** out
275d0 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28  standing xFetch(
275e0 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  ) references to 
275f0 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  it, this functio
27600 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27610 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
27620 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65   nByte is non-ne
27630 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20  gative, then it 
27640 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  is the requested
27650 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65   size of .** the
27660 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61   mapping to crea
27670 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  te. Otherwise, i
27680 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20  f nByte is less 
27690 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
276a0 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
276b0 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69  d size is the si
276c0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
276d0 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75  n disk. The actu
276e0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  al size of the.*
276f0 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e  * created mappin
27700 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  g is either the 
27710 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
27720 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66  r the value conf
27730 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67  igured .** using
27740 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
27750 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65  AP_LIMIT, whiche
27760 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a  ver is smaller..
27770 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
27780 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
27790 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  o error occurs (
277a0 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70  even if the mapp
277b0 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65  ing is not.** re
277c0 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73  created as a res
277d0 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ult of outstandi
277e0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f  ng references) o
277f0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
27800 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
27810 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
27820 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
27830 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
27840 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36 34 20  4 nByte){.  i64 
27850 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20  nMap = nByte;.  
27860 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
27870 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46  t( nMap>=0 || pF
27880 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
27890 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  );.  if( pFd->nF
278a0 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
278b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
278c0 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
278d0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
278e0 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
278f0 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
27900 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
27910 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  /.    rc = osFst
27920 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74  at(pFd->h, &stat
27930 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
27940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27950 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27960 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
27970 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d      }.    nMap =
27980 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
27990 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  ;.  }.  if( nMap
279a0 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  >pFd->mmapSizeMa
279b0 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20  x ){.    nMap = 
279c0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
279d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61  ;.  }..  if( nMa
279e0 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  p!=pFd->mmapSize
279f0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70   ){.    if( nMap
27a00 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78  >0 ){.      unix
27a10 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e  Remapfile(pFd, n
27a20 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Map);.    }else{
27a30 0a 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70  .      unixUnmap
27a40 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d  file(pFd);.    }
27a50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
27a60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
27a70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
27a80 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
27a90 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62  ./*.** If possib
27aa0 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  le, return a poi
27ab0 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e  nter to a mappin
27ac0 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61  g of file fd sta
27ad0 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a  rting at offset.
27ae0 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70  ** iOff. The map
27af0 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c  ping must be val
27b00 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  id for at least 
27b10 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  nAmt bytes..**.*
27b20 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e  * If such a poin
27b30 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69  ter can be obtai
27b40 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e  ned, store it in
27b50 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20   *pp and return 
27b60 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72  SQLITE_OK..** Or
27b70 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  , if one cannot 
27b80 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
27b90 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  urs, set *pp to 
27ba0 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
27bb0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c  ITE_OK..** Final
27bc0 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
27bd0 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75  does occur, retu
27be0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
27bf0 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e  or code. The fin
27c00 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a  al.** value of *
27c10 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  pp is undefined 
27c20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
27c30 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
27c40 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e  tion does return
27c50 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20   a pointer, the 
27c60 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e  caller must even
27c70 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61  tually .** relea
27c80 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
27c90 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78   by calling unix
27ca0 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74  Unfetch()..*/.st
27cb0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65 74  atic int unixFet
27cc0 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
27cd0 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  *fd, i64 iOff, i
27ce0 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a  nt nAmt, void **
27cf0 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pp){.#if SQLITE_
27d00 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
27d10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
27d20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64  = (unixFile *)fd
27d30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
27d40 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
27d50 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
27d60 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51  *pp = 0;..#if SQ
27d70 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
27d80 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
27d90 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
27da0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
27db0 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
27dc0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e       int rc = un
27dd0 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d  ixMapfile(pFd, -
27de0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
27df0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
27e00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
27e10 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70     if( pFd->mmap
27e20 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d  Size >= iOff+nAm
27e30 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d  t ){.      *pp =
27e40 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d   &((u8 *)pFd->pM
27e50 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b  apRegion)[iOff];
27e60 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74  .      pFd->nFet
27e70 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  chOut++;.    }. 
27e80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
27e90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27ea0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68  ./*.** If the th
27eb0 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
27ec0 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  non-NULL, then t
27ed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c  his function rel
27ee0 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65  eases a .** refe
27ef0 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62  rence obtained b
27f00 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
27f10 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29  l to unixFetch()
27f20 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  . The second.** 
27f30 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
27f40 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
27f50 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
27f60 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  e as the corresp
27f70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65  onding.** argume
27f80 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73  nt that was pass
27f90 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65  ed to the unixFe
27fa0 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
27fb0 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  . .**.** Or, if 
27fc0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
27fd0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
27fe0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27ff0 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a  s being called .
28000 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
28010 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
28020 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
28030 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
28040 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61  g mapping .** ma
28050 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64  y now be invalid
28060 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75   and should be u
28070 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  nmapped..*/.stat
28080 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65 74  ic int unixUnfet
28090 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
280a0 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76  *fd, i64 iOff, v
280b0 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c  oid *p){.#if SQL
280c0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
280d0 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  E>0.  unixFile *
280e0 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  pFd = (unixFile 
280f0 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
28100 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
28110 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55  se file */.  UNU
28120 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f  SED_PARAMETER(iO
28130 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d  ff);..  /* If p=
28140 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e  =0 (unmap the en
28150 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20  tire file) then 
28160 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  there must be no
28170 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20   outstanding .  
28180 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ** xFetch refere
28190 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d  nces. Or, if p!=
281a0 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73  0 (meaning it is
281b0 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72   an xFetch refer
281c0 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  ence),.  ** then
281d0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
281e0 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
281f0 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61  tanding.  */.  a
28200 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28  ssert( (p==0)==(
28210 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
28220 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  0) );..  /* If p
28230 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74  !=0, it must mat
28240 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75  ch the iOff valu
28250 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
28260 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38  p==0 || p==&((u8
28270 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
28280 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20  on)[iOff] );..  
28290 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64  if( p ){.    pFd
282a0 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20  ->nFetchOut--;. 
282b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
282c0 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
282d0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
282e0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30  Fd->nFetchOut>=0
282f0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53   );.#else.  UNUS
28300 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
28310 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
28320 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45  ETER(p);.  UNUSE
28330 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66  D_PARAMETER(iOff
28340 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
28350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28360 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
28370 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
28380 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
28390 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
283a0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
283b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
283c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
283d0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
283e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
28400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28440 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  **/../*.** This 
28450 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
28460 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  s definitions of
28470 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28480 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74  ods objects that
28490 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61  .** implement va
284a0 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69  rious file locki
284b0 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
284c0 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73  It also contains
284d0 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
284e0 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  of "finder" func
284f0 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72  tions.  A finder
28500 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65  -function is use
28510 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  d to locate the 
28520 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73  appropriate.** s
28530 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28540 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70  s object for a p
28550 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
28560 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41  se file.  The pA
28570 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20  ppData.** field 
28580 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  of the sqlite3_v
28590 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61  fs VFS objects a
285a0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  re initialized t
285b0 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f  o be pointers to
285c0 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
285d0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
285e0 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a  for that VFS..**
285f0 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20  .** Most finder 
28600 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
28610 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
28620 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f  fixed sqlite3_io
28630 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
28640 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e  ct.  The only in
28650 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72  teresting finder
28660 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74  -function is aut
28670 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77  olockIoFinder, w
28680 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74  hich.** looks at
28690 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
286a0 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74  type and tries t
286b0 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74  o guess the best
286c0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61   locking.** stra
286d0 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a  tegy from that..
286e0 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72  **.** For finder
286f0 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f  -function F, two
28700 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
28710 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
28720 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
28730 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
28740 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
28750 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
28760 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
28770 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
28780 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
28790 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
287a0 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
287b0 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
287c0 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
287d0 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
287e0 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
287f0 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
28800 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
28810 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
28820 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
28830 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
28840 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
28850 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
28860 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
28870 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
28880 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
28890 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
288a0 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
288b0 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
288c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
288d0 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
288e0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
288f0 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
28900 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
28910 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
28920 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
28930 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
28940 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
28950 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
28960 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
28970 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
28980 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
28990 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
289a0 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
289b0 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
289c0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
289d0 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
289e0 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
289f0 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
28a00 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 2c 20 53 48 4d  OCK, CKLOCK, SHM
28a10 4d 41 50 29 20 5c 0a 73 74 61 74 69 63 20 63 6f  MAP) \.static co
28a20 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
28a30 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
28a40 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a60 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
28a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28a80 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
28a90 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
28bb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
28bc0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28bf0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c10 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28c40 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28c60 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28c90 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28cb0 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28ce0 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28d00 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28d30 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
28d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28d50 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28d60 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
28d70 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28d80 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
28d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
28da0 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
28db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dc0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28dd0 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
28de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
28df0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e10 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28e20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
28e30 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
28e40 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
28e50 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28e60 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d         \.   SHMM
28e70 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AP,             
28e80 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
28e90 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28ec0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
28ed0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
28ee0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f00 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
28f10 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
28f20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
28f30 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f50 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
28f60 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
28f70 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
28f80 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
28f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fa0 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63     \.   unixFetc
28fb0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
28fc0 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ff0 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74    \.   unixUnfet
29000 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
29010 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
29020 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29040 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
290a0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
290b0 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28  s *FINDER##Impl(
290c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75  const char *z, u
290d0 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c  nixFile *p){   \
290e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
290f0 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
29100 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20  ARAMETER(p);    
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29130 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
29140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
291d0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
291e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
291f0 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63  *const FINDER)(c
29200 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
29210 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20  ile *p)    \.   
29220 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b   = FINDER##Impl;
29230 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
29240 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
29250 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29260 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
29270 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
29280 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
29290 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
292a0 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
292b0 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
292c0 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
292d0 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
292e0 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
292f0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
29300 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
29310 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
29320 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
29330 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
29340 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
29350 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20  t name */.  3,  
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
29380 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20  memory and mmap 
29390 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  are enabled */. 
293a0 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
293b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
293c0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
293d0 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
293e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
293f0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29400 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
29410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
29420 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
29430 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
29440 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
29450 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29460 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29470 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20  xShmMap         
29480 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
29490 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  p method */.).IO
294a0 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
294b0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
294c0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
294d0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
294e0 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
294f0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
29500 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29510 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29520 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
29530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29540 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
29550 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e   disabled */.  n
29560 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  olockClose,     
29570 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29580 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  se method */.  n
29590 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  olockLock,      
295a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
295b0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
295c0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
295d0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
295e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
295f0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
29600 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65  edLock,  /* xChe
29610 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29620 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29640 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
29650 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
29660 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
29670 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29680 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
29690 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
296a0 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
296b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
296c0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
296d0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
296e0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
296f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29700 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29710 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
29720 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
29730 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29740 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
29750 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
29760 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29770 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
29780 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
29790 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
297a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
297b0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
297c0 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b  dLock, /* xCheck
297d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
297e0 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
297f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29800 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
29810 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
29820 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
29830 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
29840 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
29850 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69  ODS(.  flockIoFi
29860 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
29870 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29880 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ion name */.  fl
29890 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
298a0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
298b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
298c0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
298d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
298e0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
298f0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29900 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  abled */.  flock
29910 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
29920 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29930 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
29940 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
29950 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29960 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55  thod */.  flockU
29970 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
29980 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29990 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
299a0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
299b0 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k,   /* xCheckRe
299c0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
299d0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299f0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
29a00 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
29a10 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  #if OS_VXWORKS.I
29a20 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49  OMETHODS(.  semI
29a30 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
29a40 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29a50 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29a60 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c  .  semIoMethods,
29a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29a90 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
29aa0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ac0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
29ad0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29ae0 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  semClose,       
29af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29b00 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29b10 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  semLock,        
29b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29b30 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
29b40 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  emUnlock,       
29b50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29b60 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29b70 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
29b80 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68  Lock,     /* xCh
29b90 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29ba0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bc0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
29bd0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
29be0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
29bf0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
29c00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
29c10 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
29c20 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
29c30 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
29c40 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29c50 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
29c60 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
29c70 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29c80 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29c90 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
29ca0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
29cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
29cc0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
29cd0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43  sabled */.  afpC
29ce0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
29cf0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
29d00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
29d10 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29d20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29d30 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
29d40 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29d50 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29d60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
29d70 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29d80 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ,     /* xCheckR
29d90 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29da0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dc0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
29dd0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29de0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
29df0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
29e00 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68  is a "super-meth
29e10 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65  od" in the sense
29e20 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e   that it.** open
29e30 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  s secondary file
29e40 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
29e50 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c   the conch and l
29e60 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a  ock files and.**
29e70 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20   it uses proxy, 
29e80 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61  dot-file, AFP, a
29e90 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  nd flock() locki
29ea0 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  ng methods on th
29eb0 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79  ose.** secondary
29ec0 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69   files.  For thi
29ed0 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
29ee0 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
29ef0 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20  ements.** proxy 
29f00 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74  locking is locat
29f10 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20  ed much further 
29f20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  down in the file
29f30 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a  .  But we need.*
29f40 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e  * to go ahead an
29f50 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c  d define the sql
29f60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29f70 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  and finder funct
29f80 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79  ion.** for proxy
29f90 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20   locking here.  
29fa0 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65  So we forward de
29fb0 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65  clare the I/O me
29fc0 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  thods..*/.#if de
29fd0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
29fe0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
29ff0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2a000 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2a010 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
2a020 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
2a030 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
2a040 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
2a050 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2a060 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
2a070 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
2a080 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63  ic int proxyChec
2a090 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
2a0a0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
2a0b0 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  *);.IOMETHODS(. 
2a0c0 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20   proxyIoFinder, 
2a0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a0e0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2a0f0 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d  me */.  proxyIoM
2a100 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2a110 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2a120 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2a130 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a150 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2a160 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2a170 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c  */.  proxyClose,
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a190 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2a1a0 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20  */.  proxyLock, 
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a1c0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2a1d0 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c  /.  proxyUnlock,
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a1f0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2a200 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52  */.  proxyCheckR
2a210 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f  eservedLock,   /
2a220 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2a230 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2a240 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
2a250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2a260 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2a270 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73  ).#endif../* nfs
2a280 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30   lockd on OSX 10
2a290 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61  .3+ doesn't clea
2a2a0 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68  r write locks wh
2a2b0 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
2a2c0 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66  s set */.#if def
2a2d0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2a2e0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2a2f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
2a300 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49  OMETHODS(.  nfsI
2a310 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2a320 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2a330 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2a340 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73  /.  nfsIoMethods
2a350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a360 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2a370 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2a380 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3a0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
2a3b0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
2a3c0 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a3e0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2a3f0 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a410 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2a420 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20  /.  nfsUnlock,  
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a440 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2a450 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
2a460 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2a470 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2a480 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2a490 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a4b0 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2a4c0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2a4d0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2a4e0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2a4f0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2a500 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
2a510 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
2a520 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
2a530 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
2a540 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
2a550 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
2a560 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
2a570 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
2a580 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
2a590 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
2a5a0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
2a5b0 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
2a5c0 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
2a5d0 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58  is is for MacOSX
2a5e0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
2a5f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a600 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
2a610 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
2a620 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
2a630 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
2a640 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2a650 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
2a660 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
2a670 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66         /* open f
2a680 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ile object for t
2a690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a6a0 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
2a6b0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70  const struct Map
2a6c0 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ping {.    const
2a6d0 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74   char *zFilesyst
2a6e0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
2a6f0 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74   /* Filesystem t
2a700 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ype name */.    
2a710 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a720 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
2a730 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72  ds;   /* Appropr
2a740 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  iate locking met
2a750 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b  hod */.  } aMap[
2a760 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73  ] = {.    { "hfs
2a770 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
2a780 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2a790 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  ufs",    &posixI
2a7a0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2a7b0 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70  { "afpfs",  &afp
2a7c0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2a7d0 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66   { "smbfs",  &af
2a7e0 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
2a7f0 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e    { "webdav", &n
2a800 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d  olockIoMethods }
2a810 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20  ,.    { 0, 0 }. 
2a820 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73   };.  int i;.  s
2a830 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2a840 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  nfo;.  struct fl
2a850 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
2a860 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
2a870 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
2a880 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
2a890 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
2a8a0 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
2a8b0 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
2a8c0 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
2a8d0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
2a8e0 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
2a8f0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2a900 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61  s;.  }.  if( sta
2a910 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
2a920 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a  sInfo) != -1 ){.
2a930 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66      if( fsInfo.f
2a940 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f  _flags & MNT_RDO
2a950 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74  NLY ){.      ret
2a960 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
2a970 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hods;.    }.    
2a980 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d  for(i=0; aMap[i]
2a990 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b  .zFilesystem; i+
2a9a0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
2a9b0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
2a9c0 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69  typename, aMap[i
2a9d0 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d  ].zFilesystem)==
2a9e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
2a9f0 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74  urn aMap[i].pMet
2aa00 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  hods;.      }.  
2aa10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65    }.  }..  /* De
2aa20 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64  fault case. Hand
2aa30 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68  les, amongst oth
2aa40 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a  ers, "nfs"..  **
2aa50 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65   Test byte-range
2aa60 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74   lock using fcnt
2aa70 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  l(). If the call
2aa80 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a   succeeds, .  **
2aa90 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2aaa0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
2aab0 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c  ports POSIX styl
2aac0 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20  e locks. .  */. 
2aad0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
2aae0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
2aaf0 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
2ab00 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
2ab10 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
2ab20 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
2ab30 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
2ab40 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
2ab50 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
2ab60 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
2ab70 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
2ab80 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2ab90 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20   "nfs")==0 ){.  
2aba0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49      return &nfsI
2abb0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20  oMethods;.    } 
2abc0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74  else {.      ret
2abd0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
2abe0 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ods;.    }.  }el
2abf0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
2ac00 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2ac10 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
2ac20 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2ac30 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f  methods .  *(*co
2ac40 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  nst autolockIoFi
2ac50 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
2ac60 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61  *,unixFile*) = a
2ac70 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
2ac80 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
2ac90 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2aca0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2acb0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2acc0 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57  E */..#if OS_VXW
2acd0 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45  ORKS && SQLITE_E
2ace0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2acf0 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
2ad00 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
2ad10 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
2ad20 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
2ad30 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
2ad40 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
2ad50 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
2ad60 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
2ad70 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
2ad80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
2ad90 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
2ada0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
2adb0 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
2adc0 68 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72  his is for VXWor
2add0 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ks only..*/.stat
2ade0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2adf0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
2ae00 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2ae10 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
2ae20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
2ae30 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2ae40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2ae50 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
2ae60 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
2ae70 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2ae80 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2ae90 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2aea0 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2aeb0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2aec0 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2aed0 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2aee0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2aef0 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2af00 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2af10 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2af20 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2af30 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2af40 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ods;.  }..  /* T
2af50 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69  est if fcntl() i
2af60 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20  s supported and 
2af70 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20  use POSIX style 
2af80 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65  locks..  ** Othe
2af90 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20  rwise fall back 
2afa0 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  to the named sem
2afb0 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20  aphore method.. 
2afc0 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
2afd0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
2afe0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
2aff0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
2b000 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
2b010 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
2b020 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
2b030 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
2b040 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
2b050 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
2b060 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f  {.    return &po
2b070 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
2b080 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2b090 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b  n &semIoMethods;
2b0a0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2b0b0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2b0c0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2b0d0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
2b0e0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
2b0f0 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
2b100 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2b110 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
2b120 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
2b130 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b140 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
2b150 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74  ** An abstract t
2b160 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65  ype for a pointe
2b170 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f  r to an IO metho
2b180 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
2b190 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f  n:.*/.typedef co
2b1a0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2b1b0 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72  ethods *(*finder
2b1c0 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61  _type)(const cha
2b1d0 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a  r*,unixFile*);..
2b1e0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2b1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2b230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69  *********** sqli
2b250 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
2b260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
2b280 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
2b290 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
2b2a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2b2b0 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
2b2c0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
2b2d0 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ject..*/../*.** 
2b2e0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63  Initialize the c
2b2f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75  ontents of the u
2b300 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
2b310 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
2b320 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pId..*/.static i
2b330 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  nt fillInUnixFil
2b340 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
2b350 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
2b360 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
2b370 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68  bject */.  int h
2b380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b390 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
2b3a0 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69  descriptor of fi
2b3b0 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2b3c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2b3d0 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20  e *pId,      /* 
2b3e0 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69  Write to the uni
2b3f0 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
2b400 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2b410 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2b420 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2b430 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
2b440 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  ed */.  int ctrl
2b450 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
2b460 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  /* Zero or more 
2b470 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65  UNIXFILE_* value
2b480 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
2b490 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b4a0 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  ds *pLockingStyl
2b4b0 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e;.  unixFile *p
2b4c0 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
2b4d0 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20  *)pId;.  int rc 
2b4e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2b4f0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49  assert( pNew->pI
2b500 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20  node==NULL );.. 
2b510 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20   /* Usually the 
2b520 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73  path zFilename s
2b530 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72  hould not be a r
2b540 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
2b550 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70  . The.  ** excep
2b560 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65  tion is when ope
2b570 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22  ning the proxy "
2b580 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62  conch" file in b
2b590 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20  uilds that.  ** 
2b5a0 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63  include the spec
2b5b0 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e  ial Apple lockin
2b5c0 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23  g styles..  */.#
2b5d0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2b5e0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2b5f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b600 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a  TYLE.  assert( z
2b610 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
2b620 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
2b630 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70   .    || pVfs->p
2b640 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29  AppData==(void*)
2b650 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  &autolockIoFinde
2b660 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73  r );.#else.  ass
2b670 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
2b680 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
2b690 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66  ]=='/' );.#endif
2b6a0 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e  ..  /* No lockin
2b6b0 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70  g occurs in temp
2b6c0 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20  orary files */. 
2b6d0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2b6e0 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c  me!=0 || (ctrlFl
2b6f0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
2b700 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20  OLOCK)!=0 );..  
2b710 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20  OSTRACE(("OPEN  
2b720 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
2b730 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
2b740 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  pNew->h = h;.  p
2b750 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  New->pVfs = pVfs
2b760 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20  ;.  pNew->zPath 
2b770 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70  = zFilename;.  p
2b780 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d  New->ctrlFlags =
2b790 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a   (u8)ctrlFlags;.
2b7a0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
2b7b0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65  MAP_SIZE>0.  pNe
2b7c0 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  w->mmapSizeMax =
2b7d0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b7e0 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e  nfig.szMmap;.#en
2b7f0 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
2b800 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28  3_uri_boolean(((
2b810 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
2b820 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c  FILE_URI) ? zFil
2b830 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20  ename : 0),.    
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b850 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53         "psow", S
2b860 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f  QLITE_POWERSAFE_
2b870 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20  OVERWRITE) ){.  
2b880 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2b890 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53  s |= UNIXFILE_PS
2b8a0 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  OW;.  }.  if( st
2b8b0 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65  rcmp(pVfs->zName
2b8c0 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30  ,"unix-excl")==0
2b8d0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
2b8e0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2b8f0 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23  ILE_EXCL;.  }..#
2b900 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2b910 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
2b920 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
2b930 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
2b940 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
2b950 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
2b960 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2b970 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2b980 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  E_NOMEM;.  }.#en
2b990 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46  dif..  if( ctrlF
2b9a0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2b9b0 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c  NOLOCK ){.    pL
2b9c0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e  ockingStyle = &n
2b9d0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2b9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
2b9f0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a  ckingStyle = (**
2ba00 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56  (finder_type*)pV
2ba10 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46  fs->pAppData)(zF
2ba20 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a  ilename, pNew);.
2ba30 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2ba40 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2ba50 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69      /* Cache zFi
2ba60 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f  lename in the lo
2ba70 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41  cking context (A
2ba80 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f  FP and dotlock o
2ba90 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20  verride) for.   
2baa0 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63   ** proxyLock ac
2bab0 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73  tivation is poss
2bac0 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f  ible (remote pro
2bad0 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64  xy is based on d
2bae0 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a  b name).    ** z
2baf0 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73  Filename remains
2bb00 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c   valid until fil
2bb10 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20  e is closed, to 
2bb20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70  support */.    p
2bb30 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2bb40 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69  ext = (void*)zFi
2bb50 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  lename;.#endif. 
2bb60 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69   }..  if( pLocki
2bb70 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69  ngStyle == &posi
2bb80 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64  xIoMethods.#if d
2bb90 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2bba0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2bbb0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2bbc0 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67  .    || pLocking
2bbd0 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d  Style == &nfsIoM
2bbe0 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20  ethods.#endif.  
2bbf0 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
2bc00 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
2bc10 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
2bc20 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
2bc30 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
2bc40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bc50 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72       /* If an er
2bc60 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20  ror occurred in 
2bc70 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c  findInodeInfo(),
2bc80 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
2bc90 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20  descriptor.     
2bca0 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c   ** immediately,
2bcb0 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e   before releasin
2bcc0 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e  g the mutex. fin
2bcd0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79  dInodeInfo() may
2bce0 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69   fail.      ** i
2bcf0 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
2bd00 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2bd10 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20  **   (a) A call 
2bd20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65  to fstat() faile
2bd30 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62  d..      **   (b
2bd40 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  ) A malloc faile
2bd50 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
2bd60 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62    ** Scenario (b
2bd70 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72  ) may only occur
2bd80 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   if the process 
2bd90 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74  is holding no ot
2bda0 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  her.      ** fil
2bdb0 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
2bdc0 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
2bdd0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65  ile. If there we
2bde0 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20  re other file.  
2bdf0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
2be00 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c  rs on this file,
2be10 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20   then no malloc 
2be20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65  would be require
2be30 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69  d by.      ** fi
2be40 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49  ndInodeInfo(). I
2be50 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
2be60 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20  se, it is quite 
2be70 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20  safe to close.  
2be80 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20      ** handle h 
2be90 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61  - as it is guara
2bea0 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f  nteed that no po
2beb0 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62  six locks will b
2bec0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20  e released.     
2bed0 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e   ** by doing so.
2bee0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2bef0 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28  ** If scenario (
2bf00 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72  a) caused the er
2bf10 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20  ror then things 
2bf20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e  are not so safe.
2bf30 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d   The.      ** im
2bf40 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f  plicit assumptio
2bf50 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69  n here is that i
2bf60 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c  f fstat() fails,
2bf70 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20   things are in. 
2bf80 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64       ** such bad
2bf90 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70   shape that drop
2bfa0 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74  ping a lock or t
2bfb0 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  wo doesn't matte
2bfc0 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f  r much..      */
2bfd0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
2bfe0 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2bff0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20  INE__);.      h 
2c000 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
2c010 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2c020 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
2c030 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2c040 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
2c050 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65  d(__APPLE__).  e
2c060 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2c070 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d  Style == &afpIoM
2c080 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2c090 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65   AFP locking use
2c0a0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
2c0b0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
2c0c0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
2c0d0 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b    ** the afpLock
2c0e0 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20  ingContext..    
2c0f0 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e  */.    afpLockin
2c100 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
2c110 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
2c120 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20  gContext = pCtx 
2c130 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2c140 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20  ( sizeof(*pCtx) 
2c150 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d  );.    if( pCtx=
2c160 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2c170 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c190 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65  /* NB: zFilename
2c1a0 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61   exists and rema
2c1b0 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
2c1c0 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  the file is clos
2c1d0 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f  ed.      ** acco
2c1e0 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65  rding to require
2c1f0 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f  ment F11141.  So
2c200 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
2c210 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20  to make a.      
2c220 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  ** copy of the f
2c230 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ilename. */.    
2c240 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d    pCtx->dbPath =
2c250 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   zFilename;.    
2c260 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64    pCtx->reserved
2c270 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e   = 0;.      sran
2c280 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20  domdev();.      
2c290 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2c2a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e  ;.      rc = fin
2c2b0 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2c2c0 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2c2d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2c2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c2f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c300 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  (pNew->lockingCo
2c310 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
2c320 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2c330 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2c340 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  .        h = -1;
2c350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
2c360 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2c370 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20          .    }. 
2c380 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73   }.#endif..  els
2c390 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2c3a0 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  yle == &dotlockI
2c3b0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2c3c0 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  /* Dotfile locki
2c3d0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2c3e0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2c3f0 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
2c400 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   in.    ** the d
2c410 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
2c420 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20  text .    */.   
2c430 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
2c440 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e  ;.    int nFilen
2c450 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ame;.    assert(
2c460 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b   zFilename!=0 );
2c470 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d  .    nFilename =
2c480 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69   (int)strlen(zFi
2c490 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20  lename) + 6;.   
2c4a0 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68   zLockFile = (ch
2c4b0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
2c4c0 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  loc(nFilename);.
2c4d0 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c      if( zLockFil
2c4e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
2c4f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2c500 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c510 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2c520 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c  tf(nFilename, zL
2c530 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f  ockFile, "%s" DO
2c540 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46  TLOCK_SUFFIX, zF
2c550 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
2c560 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
2c570 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b  gContext = zLock
2c580 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  File;.  }..#if O
2c590 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65  S_VXWORKS.  else
2c5a0 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
2c5b0 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68  le == &semIoMeth
2c5c0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61  ods ){.    /* Na
2c5d0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
2c5e0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2c5f0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2c600 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
2c610 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
2c620 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e semLockingCont
2c630 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ext.    */.    u
2c640 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2c650 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
2c660 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2c670 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2c680 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
2c690 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e  E_OK) && (pNew->
2c6a0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55  pInode->pSem==NU
2c6b0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
2c6c0 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
2c6d0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d  ew->pInode->aSem
2c6e0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Name;.      int 
2c6f0 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
2c700 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
2c710 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65  THNAME, zSemName
2c720 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20  , "/%s.sem",.   
2c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c740 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a      pNew->pId->z
2c750 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
2c760 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20        for( n=1; 
2c770 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b  zSemName[n]; n++
2c780 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   ).        if( z
2c790 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20  SemName[n]=='/' 
2c7a0 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20  ) zSemName[n] = 
2c7b0 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  '_';.      pNew-
2c7c0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20  >pInode->pSem = 
2c7d0 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d  sem_open(zSemNam
2c7e0 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36  e, O_CREAT, 0666
2c7f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
2c800 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2c810 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44  em == SEM_FAILED
2c820 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2c830 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c840 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e         pNew->pIn
2c850 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d  ode->aSemName[0]
2c860 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
2c870 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2c880 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2c890 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f  .#endif.  .  sto
2c8a0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65 77  reLastErrno(pNew
2c8b0 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  , 0);.#if OS_VXW
2c8c0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
2c8d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c8e0 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
2c8f0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2c900 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2c910 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e  h = -1;.    osUn
2c920 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
2c930 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2c940 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2c950 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e  _DELETE;.  }.#en
2c960 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
2c970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2c980 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
2c990 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2c9a0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c  __LINE__);.  }el
2c9b0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  se{.    pNew->pM
2c9c0 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67  ethod = pLocking
2c9d0 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43  Style;.    OpenC
2c9e0 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20  ounter(+1);.    
2c9f0 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65  verifyDbFile(pNe
2ca00 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  w);.  }.  return
2ca10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2ca20 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
2ca30 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20   a directory in 
2ca40 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d  which to put tem
2ca50 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
2ca60 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
2ca70 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64  temporary file d
2ca80 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20  irectory can be 
2ca90 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55  found, return NU
2caa0 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
2cab0 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
2cac0 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b  mpFileDir(void){
2cad0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2cae0 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
2caf0 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
2cb00 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
2cb10 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
2cb20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
2cb30 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30    "/tmp",.     0
2cb40 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
2cb50 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20  terminator */.  
2cb60 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
2cb70 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
2cb80 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
2cb90 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
2cba0 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
2cbb0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
2cbc0 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a  ctory;.  if( !az
2cbd0 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
2cbe0 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51  [1] = getenv("SQ
2cbf0 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20  LITE_TMPDIR");. 
2cc00 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20   if( !azDirs[2] 
2cc10 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65  ) azDirs[2] = ge
2cc20 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
2cc30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
2cc40 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
2cc50 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a  of(azDirs[0]); z
2cc60 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29  Dir=azDirs[i++])
2cc70 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  {.    if( zDir==
2cc80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2cc90 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69    if( osStat(zDi
2cca0 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  r, &buf) ) conti
2ccb0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
2ccc0 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
2ccd0 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2cce0 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28     if( osAccess(
2ccf0 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74  zDir, 07) ) cont
2cd00 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b  inue;.    break;
2cd10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44  .  }.  return zD
2cd20 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ir;.}../*.** Cre
2cd30 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
2cd40 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
2cd50 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
2cd60 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
2cd70 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
2cd80 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
2cd90 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
2cda0 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
2cdb0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2cdc0 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
2cdd0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
2cde0 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
2cdf0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
2ce00 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
2ce10 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
2ce20 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
2ce30 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2ce40 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
2ce50 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
2ce60 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
2ce70 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
2ce80 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
2ce90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2cea0 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
2ceb0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
2cec0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
2ced0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
2cee0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
2cef0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
2cf00 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
2cf10 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
2cf20 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
2cf30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
2cf40 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
2cf50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2cf60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2cf70 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
2cf80 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2cf90 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
2cfa0 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a   ) zDir = ".";..
2cfb0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2cfc0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
2cfd0 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
2cfe0 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
2cff0 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
2d000 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
2d010 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
2d020 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
2d030 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29  f( (strlen(zDir)
2d040 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45   + strlen(SQLITE
2d050 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
2d060 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a  X) + 18) >= (siz
2d070 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20  e_t)nBuf ){.    
2d080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2d090 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a  ROR;.  }..  do{.
2d0a0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2d0b0 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42  intf(nBuf-18, zB
2d0c0 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
2d0d0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2d0e0 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
2d0f0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75   (int)strlen(zBu
2d100 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
2d110 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
2d120 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
2d130 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
2d140 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
2d150 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
2d160 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
2d170 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
2d180 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
2d190 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
2d1a0 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[j] = 0;.    
2d1b0 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20  zBuf[j+1] = 0;. 
2d1c0 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73   }while( osAcces
2d1d0 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
2d1e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d1f0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
2d200 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2d210 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
2d220 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
2d230 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
2d240 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
2d250 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
2d260 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
2d270 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
2d280 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
2d290 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
2d2a0 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
2d2b0 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
2d2c0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2d2d0 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
2d2e0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2d2f0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
2d300 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
2d310 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
2d320 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
2d330 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
2d340 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
2d350 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
2d360 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
2d370 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
2d380 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
2d390 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
2d3a0 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
2d3b0 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
2d3c0 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
2d3d0 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
2d3e0 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
2d3f0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2d400 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
2d410 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2d420 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
2d430 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2d440 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
2d450 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2d460 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
2d470 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
2d480 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
2d490 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
2d4a0 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
2d4b0 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
2d4c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
2d4d0 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
2d4e0 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
2d4f0 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
2d500 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
2d510 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
2d520 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
2d530 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
2d540 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
2d550 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
2d560 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
2d570 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
2d580 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
2d590 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
2d5a0 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
2d5b0 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
2d5c0 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
2d5d0 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
2d5e0 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
2d5f0 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
2d600 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
2d610 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
2d620 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
2d630 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
2d640 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
2d650 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
2d660 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
2d670 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
2d680 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
2d690 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
2d6a0 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
2d6b0 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2d6c0 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
2d6d0 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
2d6e0 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
2d6f0 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
2d700 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
2d710 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
2d720 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
2d730 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
2d740 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
2d750 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
2d760 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
2d770 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
2d780 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
2d790 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
2d7a0 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
2d7b0 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
2d7c0 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
2d7d0 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
2d7e0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
2d7f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d800 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
2d810 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
2d820 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  /..  /* A stat()
2d830 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
2d840 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
2d850 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
2d860 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
2d870 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
2d880 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
2d890 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
2d8a0 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
2d8b0 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
2d8c0 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
2d8d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
2d8e0 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
2d8f0 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
2d900 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
2d910 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
2d920 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
2d930 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
2d940 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
2d950 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
2d960 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
2d970 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2d980 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
2d990 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
2d9a0 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
2d9b0 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
2d9c0 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
2d9d0 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
2d9e0 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
2d9f0 20 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64   reusable file d
2da00 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
2da10 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
2da20 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74  ( 0==osStat(zPat
2da30 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
2da40 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
2da50 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e  *pInode;..    un
2da60 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2da70 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f      pInode = ino
2da80 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  deList;.    whil
2da90 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49  e( pInode && (pI
2daa0 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76  node->fileId.dev
2dab0 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20  !=sStat.st_dev. 
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dad0 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66      || pInode->f
2dae0 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74  ileId.ino!=sStat
2daf0 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20  .st_ino) ){.    
2db00 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
2db10 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  de->pNext;.    }
2db20 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20  .    if( pInode 
2db30 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75  ){.      UnixUnu
2db40 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20  sedFd **pp;.    
2db50 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
2db60 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
2db70 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
2db80 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
2db90 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
2dba0 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
2dbb0 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
2dbc0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
2dbd0 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
2dbe0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2dbf0 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2dc00 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
2dc10 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f  if    /* if !OS_
2dc20 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74  VXWORKS */.  ret
2dc30 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a  urn pUnused;.}..
2dc40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2dc50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
2dc60 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64   unixOpen() to d
2dc70 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69  etermine the uni
2dc80 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  x permissions.**
2dc90 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66   to create new f
2dca0 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f  iles with. If no
2dcb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2dcc0 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
2dcd0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
2dce0 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c   a value suitabl
2dcf0 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73  e for passing as
2dd00 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
2dd10 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69  ent to open(2) i
2dd20 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20  s.** written to 
2dd30 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f  *pMode. If an IO
2dd40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
2dd50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
2dd60 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
2dd70 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2dd80 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e  e of *pMode is n
2dd90 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ot modified..**.
2dda0 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  ** In most cases
2ddb0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  , this routine s
2ddc0 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c  ets *pMode to 0,
2ddd0 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f   which will beco
2dde0 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74  me.** an indicat
2ddf0 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70  ion to robust_op
2de00 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74  en() to create t
2de10 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a  he file using.**
2de20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2de30 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2de40 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65   adjusted by the
2de50 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69   umask..** But i
2de60 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
2de70 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c   opened is a WAL
2de80 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72   or regular jour
2de90 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a  nal file, then .
2dea0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
2deb0 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c   queries the fil
2dec0 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
2ded0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
2dee0 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  the .** correspo
2def0 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  nding database f
2df00 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d  ile and sets *pM
2df10 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ode to this valu
2df20 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20  e. Whenever .** 
2df30 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e  possible, WAL an
2df40 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2df50 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e  are created usin
2df60 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  g the same permi
2df70 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68  ssions .** as th
2df80 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2df90 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2dfa0 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
2dfb0 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
2dfc0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2dfd0 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
2dfe0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
2dff0 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  e is unavailable
2e000 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53  .  But 8_3_NAMES
2e010 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
2e020 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73  r.** FAT filesys
2e030 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73  tems and permiss
2e040 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74  ions do not matt
2e050 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73  er there, so jus
2e060 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66  t use.** the def
2e070 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
2e080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e090 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
2e0a0 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
2e0b0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2e0c0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
2e0d0 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29   file (possibly)
2e0e0 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a   being created *
2e0f0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e110 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
2e120 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d  sed as 4th argum
2e130 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a  ent to xOpen() *
2e140 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64  /.  mode_t *pMod
2e150 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2e160 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d      /* OUT: Perm
2e170 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20  issions to open 
2e180 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75  file with */.  u
2e190 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20  id_t *pUid,     
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e1b0 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65  * OUT: uid to se
2e1c0 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
2e1d0 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20  .  gid_t *pGid  
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1f0 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74     /* OUT: gid t
2e200 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2e210 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2e220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2e230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2e240 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70  urn Code */.  *p
2e250 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69  Mode = 0;.  *pUi
2e260 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d  d = 0;.  *pGid =
2e270 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20   0;.  if( flags 
2e280 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
2e290 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
2e2a0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
2e2b0 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58      char zDb[MAX
2e2c0 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20  _PATHNAME+1];   
2e2d0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
2e2e0 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
2e2f0 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
2e300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e310 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
2e320 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a  bytes in zDb */.
2e330 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
2e340 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2e350 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73    /* Output of s
2e360 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73  tat() on databas
2e370 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  e file */..    /
2e380 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74  * zPath is a pat
2e390 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f  h to a WAL or jo
2e3a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
2e3b0 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
2e3c0 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74  derives.    ** t
2e3d0 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61  he path to the a
2e3e0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
2e3f0 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61  se file from zPa
2e400 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68  th. This block h
2e410 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68  andles.    ** th
2e420 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69  e following nami
2e430 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a  ng conventions:.
2e440 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2e450 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2e460 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  urnal".    **   
2e470 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
2e480 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
2e490 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
2e4a0 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  lNN".    **   "<
2e4b0 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e  path to db>-walN
2e4c0 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N".    **.    **
2e4d0 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64   where NN is a d
2e4e0 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54  ecimal number. T
2e4f0 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68  he NN naming sch
2e500 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  emes are .    **
2e510 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
2e520 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f  t_multiplex.c mo
2e530 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dule..    */.   
2e540 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74   nDb = sqlite3St
2e550 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20  rlen30(zPath) - 
2e560 31 3b 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1; .#ifdef SQLIT
2e570 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
2e580 45 53 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44  ES.    while( nD
2e590 62 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  b>0 && sqlite3Is
2e5a0 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d  alnum(zPath[nDb]
2e5b0 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69  ) ) nDb--;.    i
2e5c0 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61  f( nDb==0 || zPa
2e5d0 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72  th[nDb]!='-' ) r
2e5e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e5f0 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
2e600 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  ( zPath[nDb]!='-
2e610 27 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ' ){.      asser
2e620 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20  t( nDb>0 );.    
2e630 20 20 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b    assert( zPath[
2e640 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20  nDb]!='\n' );.  
2e650 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d      nDb--;.    }
2e660 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63  .#endif.    memc
2e670 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e  py(zDb, zPath, n
2e680 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62  Db);.    zDb[nDb
2e690 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69  ] = '\0';..    i
2e6a0 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62  f( 0==osStat(zDb
2e6b0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2e6c0 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61     *pMode = sSta
2e6d0 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37  t.st_mode & 0777
2e6e0 3b 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20  ;.      *pUid = 
2e6f0 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20  sStat.st_uid;.  
2e700 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61      *pGid = sSta
2e710 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65  t.st_gid;.    }e
2e720 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e730 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
2e740 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AT;.    }.  }els
2e750 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
2e760 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2e770 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a  ONCLOSE ){.    *
2e780 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20  pMode = 0600;.  
2e790 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e7a0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
2e7b0 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
2e7c0 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
2e7d0 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
2e7e0 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
2e7f0 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
2e800 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
2e810 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
2e820 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
2e830 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
2e840 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
2e850 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
2e860 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
2e870 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
2e880 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
2e890 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
2e8a0 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
2e8b0 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
2e8c0 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
2e8d0 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
2e8e0 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
2e8f0 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
2e900 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
2e910 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
2e920 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
2e930 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2e940 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
2e950 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
2e960 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
2e970 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
2e980 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
2e990 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
2e9a0 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
2e9b0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
2e9c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
2e9d0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
2e9e0 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
2e9f0 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
2ea00 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
2ea10 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
2ea20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
2ea30 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
2ea40 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
2ea50 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
2ea60 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
2ea70 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
2ea80 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
2ea90 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
2eaa0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
2eab0 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
2eac0 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
2ead0 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
2eae0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2eaf0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2eb00 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
2eb10 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
2eb20 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2eb30 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
2eb40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
2eb50 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
2eb60 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
2eb70 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb90 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
2eba0 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
2ebb0 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
2ebc0 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
2ebd0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2ebe0 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2ebf0 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
2ec00 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
2ec10 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
2ec20 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
2ec30 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
2ec40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2ec50 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
2ec60 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
2ec70 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
2ec80 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2ec90 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
2eca0 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
2ecb0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
2ecc0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
2ecd0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
2ece0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
2ecf0 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ed10 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
2ed20 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
2ed30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2ed40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2ed50 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2ed60 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2ed70 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
2ed80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2ed90 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66   /* UNIXFILE_* f
2eda0 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  lags */..  int i
2edb0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
2edc0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2edd0 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
2ede0 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
2edf0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2ee00 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2ee10 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
2ee20 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
2ee30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2ee40 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
2ee50 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
2ee60 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2ee70 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2ee80 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
2ee90 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
2eea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2eeb0 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54  RITE);.#if SQLIT
2eec0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2eed0 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41  _STYLE.  int isA
2eee0 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61  utoProxy  = (fla
2eef0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2ef00 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e  _AUTOPROXY);.#en
2ef10 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
2ef20 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51  __APPLE__) || SQ
2ef30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2ef40 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75  ING_STYLE.  stru
2ef50 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
2ef60 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
2ef70 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
2ef80 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
2ef90 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
2efa0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
2efb0 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
2efc0 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
2efd0 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
2efe0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
2eff0 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
2f000 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
2f010 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
2f020 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
2f030 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
2f040 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
2f050 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72   syncDir = (isCr
2f060 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
2f070 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
2f080 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
2f090 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
2f0a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f0b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  MAIN_JOURNAL .  
2f0c0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2f0d0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
2f0e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
2f0f0 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
2f100 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
2f110 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
2f120 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
2f130 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
2f140 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
2f150 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
2f160 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
2f170 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
2f180 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
2f190 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+2];.  const 
2f1a0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
2f1b0 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
2f1c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2f1d0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
2f1e0 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
2f1f0 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
2f200 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
2f210 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
2f220 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
2f230 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
2f240 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
2f250 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
2f260 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2f270 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
2f280 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
2f290 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
2f2a0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
2f2b0 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
2f2c0 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
2f2d0 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
2f2e0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
2f2f0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
2f300 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
2f310 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
2f320 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
2f330 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
2f340 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
2f350 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
2f360 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
2f370 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
2f380 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
2f390 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
2f3a0 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
2f3b0 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
2f3c0 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
2f3d0 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
2f3e0 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
2f3f0 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
2f400 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2f410 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
2f420 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
2f430 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
2f440 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
2f450 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2f460 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2f470 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2f480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
2f490 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2f4a0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2f4b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2f4c0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
2f4d0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2f4e0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2f4f0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2f500 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
2f510 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2f520 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2f530 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2f540 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
2f550 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
2f560 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
2f570 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
2f580 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
2f590 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
2f5a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f5b0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
2f5c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2f5d0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
2f5e0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
2f5f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2f600 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
2f610 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f620 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
2f630 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2f640 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
2f650 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
2f660 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2f670 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
2f680 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2f690 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
2f6a0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
2f6b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2f6c0 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74  L.  );..  /* Det
2f6d0 65 63 74 20 61 20 70 69 64 20 63 68 61 6e 67 65  ect a pid change
2f6e0 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
2f6f0 52 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20 61  RNG.  There is a
2f700 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a   race condition.
2f710 20 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74    ** here such t
2f720 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  hat two or more 
2f730 74 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69  threads all tryi
2f740 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  ng to open datab
2f750 61 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65  ases at.  ** the
2f760 20 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69   same instant mi
2f770 67 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68  ght all reset th
2f780 65 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c  e PRNG.  But mul
2f790 74 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a  tiple resets.  *
2f7a0 2a 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a  * are harmless..
2f7b0 20 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f    */.  if( rando
2f7c0 6d 6e 65 73 73 50 69 64 21 3d 67 65 74 70 69 64  mnessPid!=getpid
2f7d0 28 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d  () ){.    random
2f7e0 6e 65 73 73 50 69 64 20 3d 20 67 65 74 70 69 64  nessPid = getpid
2f7f0 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
2f800 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b  randomness(0,0);
2f810 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70  .  }..  memset(p
2f820 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
2f830 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65  File));..  if( e
2f840 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2f850 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
2f860 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2f870 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75  Unused;.    pUnu
2f880 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
2f890 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  leFd(zName, flag
2f8a0 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75  s);.    if( pUnu
2f8b0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20  sed ){.      fd 
2f8c0 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
2f8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f8e0 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2f8f0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2f900 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2f910 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
2f920 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f930 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2f940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2f950 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55   p->pUnused = pU
2f960 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44  nused;..    /* D
2f970 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
2f980 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
2f990 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
2f9a0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20  they are not.   
2f9b0 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
2f9c0 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
2f9d0 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
2f9e0 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
2f9f0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
2fa00 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
2fa10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2fa20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2fa30 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61  OPEN_URI) || zNa
2fa40 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
2fa50 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c  +1]==0 );..  }el
2fa60 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b  se if( !zName ){
2fa70 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
2fa80 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70   is NULL, the up
2fa90 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71  per layer is req
2faa0 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66  uesting a temp f
2fab0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
2fac0 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
2fad0 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63  syncDir);.    rc
2fae0 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61   = unixGetTempna
2faf0 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me(MAX_PATHNAME+
2fb00 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  2, zTmpname);.  
2fb10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2fb20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2fb30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2fb40 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61    zName = zTmpna
2fb50 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  me;..    /* Gene
2fb60 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20  rated temporary 
2fb70 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c  filenames are al
2fb80 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f  ways double-zero
2fb90 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20   terminated.    
2fba0 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71  ** for use by sq
2fbb0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
2fbc0 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73  ter(). */.    as
2fbd0 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c  sert( zName[strl
2fbe0 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
2fbf0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  );.  }..  /* Det
2fc00 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
2fc10 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61   of the flags pa
2fc20 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
2fc30 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e  o POSIX function
2fc40 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68  .  ** open(). Th
2fc50 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63  ese must be calc
2fc60 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f  ulated even if o
2fc70 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  pen() is not cal
2fc80 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65  led, as.  ** the
2fc90 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  y may be stored 
2fca0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  as part of the f
2fcb0 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75  ile handle and u
2fcc0 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  sed by the .  **
2fcd0 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f   'conch file' lo
2fce0 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  cking functions 
2fcf0 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20  later on.  */.  
2fd00 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
2fd10 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2fd20 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
2fd30 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65  sReadWrite ) ope
2fd40 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52  nFlags |= O_RDWR
2fd50 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65  ;.  if( isCreate
2fd60 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20   )    openFlags 
2fd70 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66  |= O_CREAT;.  if
2fd80 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20  ( isExclusive ) 
2fd90 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
2fda0 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29  EXCL|O_NOFOLLOW)
2fdb0 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  ;.  openFlags |=
2fdc0 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f   (O_LARGEFILE|O_
2fdd0 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20  BINARY);..  if( 
2fde0 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  fd<0 ){.    mode
2fdf0 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
2fe00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
2fe10 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
2fe20 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
2fe30 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20      uid_t uid;  
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe50 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20    /* Userid for 
2fe60 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
2fe70 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20  gid_t gid;      
2fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fe90 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65   Groupid for the
2fea0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20   file */.    rc 
2feb0 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65  = findCreateFile
2fec0 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  Mode(zName, flag
2fed0 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75  s, &openMode, &u
2fee0 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69  id, &gid);.    i
2fef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ff00 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2ff10 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b  ( !p->pUnused );
2ff20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2ff30 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ff40 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  N_WAL || eType==
2ff50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2ff60 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20  _JOURNAL );.    
2ff70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2ff80 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75   }.    fd = robu
2ff90 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2ffa0 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2ffb0 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  de);.    OSTRACE
2ffc0 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
2ffd0 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
2ffe0 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
2fff0 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
30000 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52  && errno!=EISDIR
30010 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20   && isReadWrite 
30020 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
30030 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  ){.      /* Fail
30040 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ed to open the f
30050 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ile for read/wri
30060 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72  te access. Try r
30070 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  ead-only. */.   
30080 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
30090 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
300a0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
300b0 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f  CREATE);.      o
300c0 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f  penFlags &= ~(O_
300d0 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20  RDWR|O_CREAT);. 
300e0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
300f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
30100 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  LY;.      openFl
30110 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
30120 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
30130 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20  y = 1;.      fd 
30140 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
30150 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
30160 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
30170 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
30180 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
30190 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
301a0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
301b0 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  open", zName);. 
301c0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
301d0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a  inished;.    }..
301e0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
301f0 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e  rocess is runnin
30200 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66  g as root and if
30210 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
30220 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  rollback.    ** 
30230 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66  journal or WAL f
30240 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e  ile, set the own
30250 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f  ership of the jo
30260 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20  urnal or WAL to 
30270 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  be.    ** the sa
30280 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  me as the origin
30290 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  al database..   
302a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67   */.    if( flag
302b0 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
302c0 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
302d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29  _MAIN_JOURNAL) )
302e0 7b 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e  {.      osFchown
302f0 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a  (fd, uid, gid);.
30300 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
30310 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
30320 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
30330 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
30340 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
30350 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b  f( p->pUnused ){
30360 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
30370 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
30380 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  >pUnused->flags 
30390 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
303a0 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
303b0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
303c0 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
303d0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
303e0 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46  SQLITE_UNLINK_AF
303f0 54 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a  TER_CLOSE).    z
30400 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Path = sqlite3_m
30410 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61  printf("%s", zNa
30420 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  me);.    if( zPa
30430 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  th==0 ){.      r
30440 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
30450 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
30460 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30470 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
30480 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e  else.    osUnlin
30490 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  k(zName);.#endif
304a0 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
304b0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
304c0 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20  TYLE.  else{.   
304d0 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20   p->openFlags = 
304e0 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23  openFlags;.  }.#
304f0 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
30500 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
30510 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20  OPEN_MAIN_DB;.. 
30520 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
30530 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
30540 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
30550 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73  G_STYLE.  if( fs
30560 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66  tatfs(fd, &fsInf
30570 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
30580 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
30590 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f  , errno);.    ro
305a0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
305b0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
305c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
305d0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
305e0 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
305f0 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
30600 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
30610 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
30620 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
30630 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
30640 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
30650 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  OS;.  }.  if (0 
30660 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61  == strncmp("exfa
30670 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  t", fsInfo.f_fst
30680 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
30690 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
306a0 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
306b0 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
306c0 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23  _IS_MSDOS;.  }.#
306d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
306e0 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  up appropriate c
306f0 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66  trlFlags */.  if
30700 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20  ( isDelete )    
30710 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
30720 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
30730 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20  E_DELETE;.  if( 
30740 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20  isReadonly )    
30750 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
30760 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
30770 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f  RDONLY;.  if( no
30780 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20  Lock )          
30790 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
307a0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
307b0 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63  LOCK;.  if( sync
307c0 44 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20  Dir )           
307d0 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
307e0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  |= UNIXFILE_DIRS
307f0 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  YNC;.  if( flags
30800 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
30810 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c  RI ) ctrlFlags |
30820 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a  = UNIXFILE_URI;.
30830 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
30840 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
30850 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
30860 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
30870 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d  .  isAutoProxy =
30880 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
30890 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20   isAutoProxy && 
308a0 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26  (zPath!=NULL) &&
308b0 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56   (!noLock) && pV
308c0 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20  fs->xOpen ){.   
308d0 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20   char *envforce 
308e0 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
308f0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
30900 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20  KING");.    int 
30910 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20  useProxy = 0;.. 
30920 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
30930 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
30940 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20  ==1 means force 
30950 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79  always use proxy
30960 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a  , 0 means .    *
30970 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78  * never use prox
30980 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73  y, NULL means us
30990 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d  e proxy for non-
309a0 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79  local files only
309b0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e  .  */.    if( en
309c0 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a  vforce!=NULL ){.
309d0 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
309e0 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e   atoi(envforce)>
309f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
30a00 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a      if( statfs(z
30a10 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
30a20 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
30a30 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
30a40 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c  e close(fd) call
30a50 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e   is sub-optimal.
30a60 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
30a70 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ned.        ** w
30a80 69 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61  ith fd is a data
30a90 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74  base file, and t
30aa0 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63  here are other c
30ab0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a  onnections open.
30ac0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
30ad0 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
30ae0 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69   currently holdi
30af0 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ng advisory lock
30b00 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20  s on it,.       
30b10 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c   ** then the cal
30b20 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c  l to close() wil
30b30 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c  l cancel those l
30b40 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63  ocks. In practic
30b50 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  e,.        ** we
30b60 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61  're assuming tha
30b70 74 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e  t statfs() doesn
30b80 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74  't fail very oft
30b90 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20  en. At least.   
30ba0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c       ** not whil
30bb0 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  e other file des
30bc0 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
30bd0 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
30be0 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ess on.        *
30bf0 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  * the same file 
30c00 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f  are working.  */
30c10 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
30c20 73 74 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f  stErrno(p, errno
30c30 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  );.        robus
30c40 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
30c50 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
30c60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
30c70 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20  ERR_ACCESS;.    
30c80 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
30c90 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nished;.      }.
30ca0 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
30cb0 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67   !(fsInfo.f_flag
30cc0 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20  s&MNT_LOCAL);.  
30cd0 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50    }.    if( useP
30ce0 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
30cf0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
30d00 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
30d10 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
30d20 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
30d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30d40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
30d50 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
30d60 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  File((unixFile*)
30d70 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29  pFile, ":auto:")
30d80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30d90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30da0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
30db0 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65  unixClose to cle
30dc0 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72  an up the resour
30dd0 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c  ces added in fil
30de0 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20  lInUnixFile .   
30df0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c         ** and cl
30e00 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75  ear all the stru
30e10 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63  cture's referenc
30e20 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  es.  Specificall
30e30 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y, .          **
30e40 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
30e50 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f   will be NULL so
30e60 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20   sqlite3OsClose 
30e70 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20  will be a no-op 
30e80 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
30e90 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73          unixClos
30ea0 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
30eb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30ed0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
30ee0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
30ef0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
30f00 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
30f10 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70  File(pVfs, fd, p
30f20 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72  File, zPath, ctr
30f30 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66  lFlags);..open_f
30f40 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72  inished:.  if( r
30f50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30f60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
30f70 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  (p->pUnused);.  
30f80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
30f90 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
30fa0 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74  the file at zPat
30fb0 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e  h. If the dirSyn
30fc0 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  c argument is tr
30fd0 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74  ue, fsync().** t
30fe0 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  he directory aft
30ff0 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
31000 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
31010 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a  int unixDelete(.
31020 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
31030 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56  otUsed,     /* V
31040 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
31050 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74  is as the xDelet
31060 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  e method */.  co
31070 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
31080 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
31090 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  of file to be de
310a0 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  leted */.  int d
310b0 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  irSync          
310c0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
310d0 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f   fsync() directo
310e0 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
310f0 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  g file */.){.  i
31100 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31110 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  K;.  UNUSED_PARA
31120 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
31130 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
31140 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
31150 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
31160 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50   if( osUnlink(zP
31170 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ath)==(-1) ){.  
31180 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f    if( errno==ENO
31190 45 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ENT.#if OS_VXWOR
311a0 4b 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 73  KS.        || os
311b0 41 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29 21  Access(zPath,0)!
311c0 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b  =0.#endif.    ){
311d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
311e0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
311f0 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65  NOENT;.    }else
31200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
31210 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
31220 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22  _IOERR_DELETE, "
31230 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b  unlink", zPath);
31240 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
31250 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  n rc;.  }.#ifnde
31260 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
31270 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28  _DIRSYNC.  if( (
31280 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20  dirSync & 1)!=0 
31290 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20  ){.    int fd;. 
312a0 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69     rc = osOpenDi
312b0 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
312c0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
312d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
312e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
312f0 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
31300 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20  ==-1 ).#else.   
31310 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
31320 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
31330 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
31340 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
31350 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
31360 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61  NC, "fsync", zPa
31370 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
31380 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
31390 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
313a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
313b0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
313c0 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  PEN ){.      rc 
313d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
313e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
313f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
31400 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69  .** Test the exi
31410 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63  stence of or acc
31420 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ess permissions 
31430 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54  of file zPath. T
31440 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f  he.** test perfo
31450 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rmed depends on 
31460 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61  the value of fla
31470 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  gs:.**.**     SQ
31480 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
31490 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TS: Return 1 if 
314a0 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a  the file exists.
314b0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
314c0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20  CESS_READWRITE: 
314d0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
314e0 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64  file is read and
314f0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20   writable..**   
31500 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
31510 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e  READONLY: Return
31520 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
31530 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a  s readable..**.*
31540 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75  * Otherwise retu
31550 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
31560 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a  int unixAccess(.
31570 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
31580 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65  otUsed,   /* The
31590 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
315a0 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74  this xAccess met
315b0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
315c0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
315d0 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20   /* Path of the 
315e0 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20  file to examine 
315f0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31610 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20  What do we want 
31620 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74  to learn about t
31630 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a  he zPath file? *
31640 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
31650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
31660 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c  rite result bool
31670 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ean here */.){. 
31680 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a   int amode = 0;.
31690 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
316a0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
316b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
316c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
316d0 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
316e0 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
316f0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
31700 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
31710 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46  .      amode = F
31720 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
31730 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
31740 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
31750 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TE:.      amode 
31760 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20  = W_OK|R_OK;.   
31770 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
31780 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
31790 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f  _READ:.      amo
317a0 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20  de = R_OK;.     
317b0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
317c0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
317d0 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
317e0 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
317f0 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
31800 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c  (osAccess(zPath,
31810 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69   amode)==0);.  i
31820 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  f( flags==SQLITE
31830 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 26  _ACCESS_EXISTS &
31840 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20  & *pResOut ){.  
31850 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
31860 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73  f;.    if( 0==os
31870 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66  Stat(zPath, &buf
31880 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65  ) && buf.st_size
31890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ==0 ){.      *pR
318a0 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d  esOut = 0;.    }
318b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
318c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
318d0 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
318e0 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
318f0 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
31900 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
31910 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
31920 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
31930 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
31940 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
31950 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
31960 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
31970 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
31980 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
31990 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
319a0 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
319b0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
319c0 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
319d0 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
319e0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
319f0 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
31a00 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
31a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
31a20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
31a30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
31a40 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
31a50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
31a60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
31a70 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
31a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
31a90 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
31aa0 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
31ab0 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
31ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31ad0 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
31ae0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
31af0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
31b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b10 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
31b20 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20  fer */.){..  /* 
31b30 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
31b40 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
31b50 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
31b60 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
31b70 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
31b80 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
31b90 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
31ba0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
31bb0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
31bc0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
31bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
31be0 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
31bf0 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
31c00 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
31c10 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
31c20 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
31c30 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
31c40 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
31c50 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
31c60 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
31c70 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
31c80 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
31c90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
31ca0 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  s);..  zOut[nOut
31cb0 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  -1] = '\0';.  if
31cc0 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
31cd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
31ce0 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
31cf0 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
31d00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
31d10 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28  nt nCwd;.    if(
31d20 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20   osGetcwd(zOut, 
31d30 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  nOut-1)==0 ){.  
31d40 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
31d50 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
31d60 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67  ANTOPEN_BKPT, "g
31d70 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a  etcwd", zPath);.
31d80 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d      }.    nCwd =
31d90 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75   (int)strlen(zOu
31da0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
31db0 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43  snprintf(nOut-nC
31dc0 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c  wd, &zOut[nCwd],
31dd0 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a   "/%s", zPath);.
31de0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
31df0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e  ITE_OK;.}...#ifn
31e00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31e10 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
31e20 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
31e30 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
31e40 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
31e50 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
31e60 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
31e70 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
31e80 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
31e90 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
31ea0 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c  .*/.#include <dl
31eb0 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f  fcn.h>.static vo
31ec0 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73  id *unixDlOpen(s
31ed0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31ee0 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  sed, const char 
31ef0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55  *zFilename){.  U
31f00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31f10 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
31f20 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e  rn dlopen(zFilen
31f30 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20  ame, RTLD_NOW | 
31f40 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a  RTLD_GLOBAL);.}.
31f50 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61  ./*.** SQLite ca
31f60 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
31f70 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  n immediately af
31f80 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e  ter a call to un
31f90 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20  ixDlSym() or.** 
31fa0 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69  unixDlOpen() fai
31fb0 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75  ls (returns a nu
31fc0 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20  ll pointer). If 
31fd0 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20  a more detailed 
31fe0 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65  error.** message
31ff0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69   is available, i
32000 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
32010 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65  zBufOut. If no e
32020 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
32030 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42  is available, zB
32040 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e  ufOut is left un
32050 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c  modified and SQL
32060 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75  ite uses a defau
32070 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  lt.** error mess
32080 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
32090 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28  oid unixDlError(
320a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
320b0 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
320c0 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
320d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
320e0 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rr;.  UNUSED_PAR
320f0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32100 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
32110 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c  x();.  zErr = dl
32120 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a  error();.  if( z
32130 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
32140 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
32150 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c  , zBufOut, "%s",
32160 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e   zErr);.  }.  un
32170 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
32180 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
32190 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65  unixDlSym(sqlite
321a0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
321b0 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63  void *p, const c
321c0 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  har*zSym))(void)
321d0 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43  {.  /* .  ** GCC
321e0 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
321f0 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74  errors says that
32200 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c   C90 does not al
32210 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62  low a void* to b
32220 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f  e.  ** cast into
32230 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
32240 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79  function.  And y
32250 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64  et the library d
32260 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20  lsym() routine. 
32270 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f   ** returns a vo
32280 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61  id* which is rea
32290 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
322a0 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f   a function.  So
322b0 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20   how do we.  ** 
322c0 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68  use dlsym() with
322d0 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
322e0 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72  s?.  **.  ** Var
322f0 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73  iable x below is
32300 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61   defined to be a
32310 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
32320 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20  nction taking.  
32330 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f  ** parameters vo
32340 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68  id* and const ch
32350 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e  ar* and returnin
32360 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  g a pointer to a
32370 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
32380 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20  We initialize x 
32390 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  by assigning it 
323a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
323b0 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f   dlsym() functio
323c0 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73  n..  ** (That as
323d0 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  signment require
323e0 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e  s a cast.)  Then
323f0 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e   we call the fun
32400 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20  ction that.  ** 
32410 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20  x points to.  . 
32420 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f   **.  ** This wo
32430 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c  rk-around is unl
32440 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f  ikely to work co
32450 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73  rrectly on any s
32460 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a  ystem where.  **
32470 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e   you really cann
32480 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69  ot cast a functi
32490 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20  on pointer into 
324a0 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e  void*.  But then
324b0 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74  , on the.  ** ot
324c0 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28  her hand, dlsym(
324d0 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  ) will not work 
324e0 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d  on such a system
324f0 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68   either, so we h
32500 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61  ave.  ** not rea
32510 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e  lly lost anythin
32520 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28  g..  */.  void (
32530 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  *(*x)(void*,cons
32540 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b  t char*))(void);
32550 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32560 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32570 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76  x = (void(*(*)(v
32580 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
32590 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a  ))(void))dlsym;.
325a0 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c    return (*x)(p,
325b0 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63   zSym);.}.static
325c0 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73   void unixDlClos
325d0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
325e0 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48  otUsed, void *pH
325f0 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
32600 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32610 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70  ed);.  dlclose(p
32620 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65  Handle);.}.#else
32630 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d   /* if SQLITE_OM
32640 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
32650 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f  N is defined: */
32660 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
32670 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
32680 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30  ne unixDlError 0
32690 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
326a0 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69  lSym   0.  #defi
326b0 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30  ne unixDlClose 0
326c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
326d0 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20  rite nBuf bytes 
326e0 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74  of random data t
326f0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  o the supplied b
32700 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73  uffer zBuf..*/.s
32710 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61  tatic int unixRa
32720 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
32730 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
32740 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
32750 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
32760 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32770 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a  );.  assert((siz
32780 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f  e_t)nBuf>=(sizeo
32790 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66  f(time_t)+sizeof
327a0 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57  (int)));..  /* W
327b0 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61  e have to initia
327c0 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65  lize zBuf to pre
327d0 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72  vent valgrind fr
327e0 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a  om reporting.  *
327f0 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72  * errors.  The r
32800 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79  eports issued by
32810 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e   valgrind are in
32820 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75  correct - we wou
32830 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74  ld.  ** prefer t
32840 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65  hat the randomne
32850 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ss be increased 
32860 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66  by making use of
32870 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74   the.  ** uninit
32880 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e  ialized space in
32890 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67   zBuf - but valg
328a0 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64  rind errors tend
328b0 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73   to worry.  ** s
328c0 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68  ome users.  Rath
328d0 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69  er than argue, i
328e0 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a  t seems easier j
328f0 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ust to initializ
32900 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65  e.  ** the whole
32910 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e   array and silen
32920 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65  ce valgrind, eve
32930 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
32940 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a  less randomness.
32950 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64    ** in the rand
32960 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20  om seed..  **.  
32970 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c  ** When testing,
32980 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42   initializing zB
32990 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20  uf[] to zero is 
329a0 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74  all we do.  That
329b0 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
329c0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
329d0 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e  he same random n
329e0 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20  umber sequence. 
329f0 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a   This makes the.
32a00 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61    ** tests repea
32a10 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  table..  */.  me
32a20 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
32a30 75 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73  uf);.  randomnes
32a40 73 50 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b  sPid = getpid();
32a50 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
32a60 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b  SQLITE_TEST).  {
32a70 0a 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74  .    int fd, got
32a80 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
32a90 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  t_open("/dev/ura
32aa0 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c  ndom", O_RDONLY,
32ab0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c   0);.    if( fd<
32ac0 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f  0 ){.      time_
32ad0 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28  t t;.      time(
32ae0 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  &t);.      memcp
32af0 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65  y(zBuf, &t, size
32b00 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65  of(t));.      me
32b10 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
32b20 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65  f(t)], &randomne
32b30 73 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61  ssPid, sizeof(ra
32b40 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20  ndomnessPid));. 
32b50 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
32b60 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61  eof(t)+sizeof(ra
32b70 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73  ndomnessPid)<=(s
32b80 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20  ize_t)nBuf );.  
32b90 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f      nBuf = sizeo
32ba0 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61  f(t) + sizeof(ra
32bb0 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20  ndomnessPid);.  
32bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
32bd0 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28  o{ got = osRead(
32be0 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b  fd, zBuf, nBuf);
32bf0 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
32c00 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
32c10 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
32c20 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
32c30 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NE__);.    }.  }
32c40 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
32c50 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   nBuf;.}.../*.**
32c60 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
32c70 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
32c80 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
32c90 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
32ca0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
32cb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
32cc0 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61  croseconds we wa
32cd0 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20  nt to sleep..** 
32ce0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
32cf0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
32d00 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f  f microseconds o
32d10 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79  f sleep actually
32d20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72  .** requested fr
32d30 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  om the underlyin
32d40 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
32d50 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69  em, a number whi
32d60 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67  ch.** might be g
32d70 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
32d80 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75  qual to the argu
32d90 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65  ment, but not le
32da0 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61  ss.** than the a
32db0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
32dc0 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70  ic int unixSleep
32dd0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32de0 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f  tUsed, int micro
32df0 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53  seconds){.#if OS
32e00 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
32e10 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a  t timespec sp;..
32e20 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69    sp.tv_sec = mi
32e30 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  croseconds / 100
32e40 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73  0000;.  sp.tv_ns
32e50 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ec = (microsecon
32e60 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20  ds % 1000000) * 
32e70 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65  1000;.  nanoslee
32e80 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20  p(&sp, NULL);.  
32e90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32ea0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
32eb0 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
32ec0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
32ed0 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
32ee0 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73  HAVE_USLEEP.  us
32ef0 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64  leep(microsecond
32f00 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
32f10 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32f20 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
32f30 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20  econds;.#else.  
32f40 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d  int seconds = (m
32f50 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39  icroseconds+9999
32f60 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73  99)/1000000;.  s
32f70 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20  leep(seconds);. 
32f80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
32f90 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
32fa0 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30  turn seconds*100
32fb0 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  0000;.#endif.}..
32fc0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
32fd0 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
32fe0 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
32ff0 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
33000 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
33010 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
33020 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
33030 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
33040 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
33050 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
33060 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
33070 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
33080 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
33090 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
330a0 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
330b0 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
330c0 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
330d0 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
330e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
330f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
33100 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
33110 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
33120 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
33130 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
33140 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
33150 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
33160 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
33170 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
33180 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
33190 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
331a0 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
331b0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
331c0 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
331d0 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
331e0 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
331f0 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
33200 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
33210 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
33220 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
33230 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
33240 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
33250 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
33260 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
33270 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
33280 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  date .** cannot 
33290 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
332a0 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
332b0 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c  entTimeInt64(sql
332c0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
332d0 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
332e0 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74   *piNow){.  stat
332f0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
33300 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
33310 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
33320 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
33330 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  00;.  int rc = S
33340 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65  QLITE_OK;.#if de
33350 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29  fined(NO_GETTOD)
33360 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
33370 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f  ime(&t);.  *piNo
33380 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e  w = ((sqlite3_in
33390 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e  t64)t)*1000 + un
333a0 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f  ixEpoch;.#elif O
333b0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
333c0 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77  ct timespec sNow
333d0 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  ;.  clock_gettim
333e0 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45  e(CLOCK_REALTIME
333f0 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e  , &sNow);.  *piN
33400 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
33410 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
33420 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
33430 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f   + sNow.tv_nsec/
33440 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20  1000000;.#else. 
33450 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
33460 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74  sNow;.  if( gett
33470 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
33480 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69  0)==0 ){.    *pi
33490 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
334a0 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
334b0 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
334c0 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  c + sNow.tv_usec
334d0 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  /1000;.  }else{.
334e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
334f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69  ERROR;.  }.#endi
33500 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
33510 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
33520 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
33530 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
33540 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
33550 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
33560 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
33570 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
33580 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
33590 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
335a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
335b0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
335c0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
335d0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
335e0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
335f0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
33600 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
33610 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
33620 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
33630 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
33640 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
33650 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
33660 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
33670 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
33680 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
33690 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
336a0 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
336b0 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
336c0 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20  3_int64 i = 0;. 
336d0 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45   int rc;.  UNUSE
336e0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
336f0 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69  sed);.  rc = uni
33700 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
33710 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e  4(0, &i);.  *prN
33720 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
33730 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
33740 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65  }../*.** We adde
33750 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72  d the xGetLastEr
33760 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74  ror() method wit
33770 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20  h the intention 
33780 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20  of providing.** 
33790 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c  better low-level
337a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
337b0 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73  when operating-s
337c0 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63  ystem problems c
337d0 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67  ome up.** during
337e0 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f   SQLite operatio
337f0 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20  n.  But so far, 
33800 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73  none of that has
33810 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
33820 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65  d.** in the core
33830 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69  .  So this routi
33840 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
33850 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74  ed.  For now, it
33860 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20   is merely.** a 
33870 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f  place-holder..*/
33880 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
33890 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
338a0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
338b0 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c  d, int NotUsed2,
338c0 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29   char *NotUsed3)
338d0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
338e0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
338f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
33900 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55  R(NotUsed2);.  U
33910 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33920 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74  NotUsed3);.  ret
33930 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
33940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33950 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71  ****** End of sq
33960 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
33970 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
33980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
33990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
339e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
33a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
33a50 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  Proxy Locking **
33a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
33a80 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
33a90 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f  ng is a "uber-lo
33aa0 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e  cking-method" in
33ab0 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74   this sense:  It
33ac0 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68   uses the.** oth
33ad0 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  er locking metho
33ae0 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20  ds on secondary 
33af0 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f  lock files.  Pro
33b00 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a  xy locking is a.
33b10 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76  ** meta-layer ov
33b20 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72  er top of the pr
33b30 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
33b40 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76  implemented abov
33b50 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20  e.  For.** this 
33b60 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
33b70 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
33b80 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f  ents of proxy lo
33b90 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65  cking is deferre
33ba0 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20  d.** until late 
33bb0 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72  in the file (her
33bc0 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  e) after all of 
33bd0 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65  the other I/O me
33be0 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65  thods have.** be
33bf0 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20  en defined - so 
33c00 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
33c10 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ve locking metho
33c20 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ds are available
33c30 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20  .** as services 
33c40 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65  to help with the
33c50 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
33c60 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
33c70 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ..**.****.**.** 
33c80 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  The default lock
33c90 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53  ing schemes in S
33ca0 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72  QLite use byte-r
33cb0 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ange locks on th
33cc0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
33cd0 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  le to coordinate
33ce0 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e   safe, concurren
33cf0 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  t access by mult
33d00 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  iple readers.** 
33d10 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74  and writers [htt
33d20 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c  p://sqlite.org/l
33d30 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20  ockingv3.html]. 
33d40 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c   The five file l
33d50 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  ocking.** states
33d60 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44   (UNLOCKED, PEND
33d70 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53  ING, SHARED, RES
33d80 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45  ERVED, EXCLUSIVE
33d90 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
33da0 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65  d.** as POSIX re
33db0 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73  ad & write locks
33dc0 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20   over fixed set 
33dd0 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69  of locations (vi
33de0 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20  a fsctl),.** on 
33df0 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79  AFP and SMB only
33e00 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d   exclusive byte-
33e10 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
33e20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73  available via fs
33e30 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57  ctl.** with _IOW
33e40 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
33e50 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
33e60 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65  B2) to track the
33e70 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a   same 5 states..
33e80 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61  ** To simulate a
33e90 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20   F_RDLCK on the 
33ea0 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e  shared range, on
33eb0 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20   AFP a randomly 
33ec0 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72  selected.** addr
33ed0 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65  ess in the share
33ee0 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
33ef0 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f   for a SHARED lo
33f00 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a  ck, the entire.*
33f10 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  * shared range i
33f20 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45  s taken for an E
33f30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a  XCLUSIVE lock):.
33f40 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49  **.**      PENDI
33f50 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30  NG_BYTE        0
33f60 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20  x40000000.**    
33f70 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
33f80 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
33f90 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
33fa0 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
33fb0 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
33fc0 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
33fd0 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
33fe0 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
33ff0 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
34000 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
34010 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
34020 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
34030 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
34040 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
34050 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
34060 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
34070 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
34080 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
34090 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
340a0 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
340b0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
340c0 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
340d0 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
340e0 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
340f0 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
34100 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
34110 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
34120 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
34130 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
34140 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
34150 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
34160 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
34170 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
34180 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
34190 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
341a0 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
341b0 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
341c0 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
341d0 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
341e0 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
341f0 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
34200 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
34210 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
34220 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
34230 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
34240 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
34250 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
34260 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
34270 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
34280 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
34290 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
342a0 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
342b0 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
342c0 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
342d0 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
342e0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
342f0 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
34300 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
34310 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
34320 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
34330 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
34340 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
34350 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
34360 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
34370 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
34380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
34390 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
343a0 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
343b0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
343c0 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
343d0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
343e0 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72               <pr
34400 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75  oxy_path> | ":au
34410 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74  to:");.**  sqlit
34420 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
34430 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
34440 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
34450 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
34460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34470 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74       &<proxy_pat
34480 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
34490 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
344a0 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
344b0 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
344c0 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
344d0 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
344e0 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
344f0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
34500 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
34510 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
34520 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
34530 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
34540 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
34550 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
34560 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
34570 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
34580 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
34590 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
345a0 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
345b0 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
345c0 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
345d0 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
345e0 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
345f0 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
34600 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
34610 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
34620 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
34630 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
34640 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
34650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34660 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
34670 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
34680 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
34690 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
346a0 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
346b0 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
346c0 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
346d0 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
346e0 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
346f0 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
34700 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
34710 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
34720 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
34730 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
34740 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
34750 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
34760 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
34770 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
34780 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
34790 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
347a0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
347b0 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
347c0 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
347d0 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
347e0 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
347f0 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
34800 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
34810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34820 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
34830 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
34840 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
34850 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
34860 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
34870 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
34880 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
34890 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
348a0 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
348b0 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
348c0 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
348d0 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
348e0 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
348f0 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
34900 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
34910 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
34920 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
34930 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
34940 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
34950 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
34960 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
34970 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
34980 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
34990 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
349a0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
349b0 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
349c0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
349d0 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
349e0 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
349f0 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
34a00 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
34a10 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
34a20 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
34a30 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
34a40 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
34a50 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
34a60 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
34a70 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
34a80 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
34a90 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
34aa0 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
34ab0 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
34ac0 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
34ad0 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
34ae0 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
34af0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
34b00 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
34b10 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  its contents do 
34b20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
34b30 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
34b40 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
34b50 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
34b60 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
34b70 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
34b80 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
34b90 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
34ba0 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
34bb0 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
34bc0 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
34bd0 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
34be0 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
34bf0 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
34c00 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
34c10 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
34c20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
34c30 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
34c40 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
34c50 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
34c60 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
34c70 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
34c80 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
34c90 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
34ca0 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
34cb0 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
34cc0 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
34cd0 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
34ce0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
34cf0 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
34d00 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
34d10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
34d20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
34d30 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
34d40 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
34d50 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
34d60 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
34d70 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
34d80 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
34d90 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
34da0 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
34db0 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
34dc0 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
34dd0 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
34de0 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
34df0 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
34e00 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
34e10 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
34e20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
34e30 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
34e40 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
34e50 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
34e60 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
34e70 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
34e80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
34e90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
34ea0 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
34eb0 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
34ec0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
34ed0 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
34ee0 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
34ef0 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
34f00 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
34f10 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
34f20 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
34f30 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
34f40 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
34f50 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
34f60 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
34f70 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
34f80 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
34f90 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
34fa0 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
34fb0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
34fc0 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
34fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
34fe0 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
34ff0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
35000 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
35010 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
35020 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
35030 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
35040 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
35050 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
35060 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
35070 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
35080 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
35090 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
350a0 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
350b0 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
350c0 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
350d0 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
350e0 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
350f0 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
35100 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
35110 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
35120 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
35130 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
35140 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
35150 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
35160 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  reation.**.**  L
35170 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
35180 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
35190 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
351a0 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
351b0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
351c0 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
351d0 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
351e0 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
351f0 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
35200 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
35210 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
35220 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
35230 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
35240 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
35250 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
35260 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
35270 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
35280 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
35290 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
352a0 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
352b0 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
352c0 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
352d0 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
352e0 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
352f0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
35300 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
35310 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
35320 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
35330 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
35340 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
35350 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
35360 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
35370 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
35380 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
35390 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
353a0 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
353b0 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
353c0 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
353d0 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
353e0 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
353f0 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67  plicitly calling
35400 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
35410 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
35420 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
35430 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
35440 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
35450 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
35460 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
35470 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
35480 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
35490 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
354a0 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
354b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
354c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
354d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
354e0 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
354f0 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
35500 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
35510 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
35520 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
35530 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
35540 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
35550 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
35560 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
35570 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
35580 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
35590 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
355a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
355b0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
355c0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
355d0 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
355e0 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
355f0 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
35600 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
35610 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
35620 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
35630 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
35640 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
35650 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
35660 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
35670 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
35680 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
35690 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
356a0 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
356b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
356c0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
356d0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
356e0 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
356f0 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
35700 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
35710 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
35720 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20  .  int nFails;  
35730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35740 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
35750 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72  ch taking failur
35760 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  es */.  void *ol
35770 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
35780 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
35790 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
357a0 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
357b0 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
357c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
357d0 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
357e0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
357f0 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
35800 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
35810 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
35820 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
35830 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
35840 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
35850 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
35860 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
35870 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
35880 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
35890 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
358a0 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
358b0 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
358c0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
358d0 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
358e0 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
358f0 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
35900 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
35910 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
35920 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
35930 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
35940 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
35950 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
35960 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
35970 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
35980 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
35990 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
359a0 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
359b0 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
359c0 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
359d0 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
359e0 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
359f0 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
35a00 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
35a10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
35a20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
35a30 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
35a40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35a50 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
35a60 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
35a70 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
35a80 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
35a90 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
35aa0 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
35ab0 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
35ac0 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
35ad0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
35ae0 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
35af0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
35b00 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
35b10 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
35b20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
35b30 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
35b40 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
35b50 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
35b60 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
35b70 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
35b80 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
35b90 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
35ba0 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
35bb0 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
35bc0 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
35bd0 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
35be0 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
35bf0 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
35c00 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
35c10 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
35c20 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
35c30 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
35c40 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
35c50 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
35c60 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
35c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35c80 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
35c90 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
35ca0 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
35cb0 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
35cc0 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
35cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35ce0 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
35cf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
35d00 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
35d10 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
35d20 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
35d30 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
35d40 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
35d50 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
35d60 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
35d70 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
35d80 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
35d90 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
35da0 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
35db0 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
35dc0 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
35dd0 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
35de0 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
35df0 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
35e00 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
35e10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
35e20 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
35e30 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
35e40 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
35e50 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
35e60 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
35e70 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
35e80 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
35e90 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
35ea0 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
35eb0 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
35ec0 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
35ed0 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
35ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
35ef0 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
35f00 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66   if( osMkdir(buf
35f10 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
35f20 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
35f30 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
35f40 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
35f50 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
35f60 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
35f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
35f80 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
35f90 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
35fa0 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
35fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fc0 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
35fd0 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
35fe0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
35ff0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
36000 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
36010 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
36020 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
36030 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
36040 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36050 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
36060 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
36070 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
36080 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
36090 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
360a0 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
360b0 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
360c0 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61  id=%d\n", lockPa
360d0 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
360e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
360f0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
36100 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
36110 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
36120 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
36130 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
36140 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
36150 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
36160 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
36170 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
36180 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
36190 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
361a0 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
361b0 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
361c0 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
361d0 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
361e0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
361f0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
36200 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
36210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
36220 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
36230 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
36240 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
36250 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
36260 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
36270 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
36280 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
36290 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
362a0 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
362b0 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
362c0 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
362d0 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
362e0 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
362f0 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
36300 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
36310 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69  d = -1;.  unixFi
36320 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  le *pNew;.  int 
36330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
36340 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
36350 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
36360 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  AT;.  sqlite3_vf
36370 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e  s dummyVfs;.  in
36380 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t terrno = 0;.  
36390 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
363a0 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  nused = NULL;.. 
363b0 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79   /* 1. first try
363c0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
363d0 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e  the file.  ** 2.
363e0 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
363f0 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f  and this is a lo
36400 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e  ck file (not-con
36410 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e  ch), try creatin
36420 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e  g.  ** the paren
36430 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e  t directories an
36440 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e  d then try again
36450 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61  ..  ** 3. if tha
36460 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20  t fails, try to 
36470 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65  open the file re
36480 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  ad-only.  ** oth
36490 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55  erwise return BU
364a0 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65  SY (if lock file
364b0 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f  ) or CANTOPEN fo
364c0 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
364d0 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20  .  */.  pUnused 
364e0 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
364f0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
36500 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64  );.  if( pUnused
36510 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e   ){.    fd = pUn
36520 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73  used->fd;.  }els
36530 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  e{.    pUnused =
36540 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
36550 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
36560 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75  );.    if( !pUnu
36570 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sed ){.      ret
36580 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
36590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
365a0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64  ( fd<0 ){.    fd
365b0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
365c0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
365d0 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  0);.    terrno =
365e0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
365f0 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
36600 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
36610 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
36620 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
36630 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
36640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36650 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
36660 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
36670 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ags, 0);.      }
36680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
36690 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65   fd<0 ){.    ope
366a0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
366b0 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  Y;.    fd = robu
366c0 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
366d0 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
366e0 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
366f0 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
36700 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63  ){.    if( isloc
36710 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  kfile ){.      r
36720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
36730 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  Y;.    }.    swi
36740 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20  tch (terrno) {. 
36750 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53       case EACCES
36760 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
36770 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
36780 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20      case EIO: . 
36790 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
367a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
367b0 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   /* even though 
367c0 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20  it is the conch 
367d0 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  */.      default
367e0 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
367f0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
36800 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
36810 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e  .  .  pNew = (un
36820 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  ixFile *)sqlite3
36830 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
36840 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e  pNew));.  if( pN
36850 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ew==NULL ){.    
36860 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
36870 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  M;.    goto end_
36880 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20  create_proxy;.  
36890 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
368a0 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
368b0 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  ile));.  pNew->o
368c0 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
368d0 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lags;.  memset(&
368e0 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a  dummyVfs, 0, siz
368f0 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a  eof(dummyVfs));.
36900 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
36910 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
36920 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
36930 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65    dummyVfs.zName
36940 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55   = "dummy";.  pU
36950 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
36960 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73    pUnused->flags
36970 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
36980 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20  pNew->pUnused = 
36990 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63  pUnused;.  .  rc
369a0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
369b0 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
369c0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
369d0 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a  pNew, path, 0);.
369e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
369f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
36a00 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
36a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36a20 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
36a30 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
36a40 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
36a50 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
36a60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
36a70 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
36a80 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
36a90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
36aa0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
36ab0 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
36ac0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
36ad0 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
36ae0 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
36af0 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
36b00 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
36b10 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
36b20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
36b30 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
36b40 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
36b50 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61  gth */../* Not a
36b60 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
36b70 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
36b80 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
36b90 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
36ba0 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
36bb0 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
36bc0 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
36bd0 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  ;../* get the ho
36be0 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
36bf0 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
36c00 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
36c10 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
36c20 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
36c30 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
36c40 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36c50 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
36c60 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
36c70 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
36c80 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
36c90 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
36ca0 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
36cb0 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
36cc0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
36cd0 4e 29 3b 0a 23 20 69 66 20 64 65 66 69 6e 65 64  N);.# if defined
36ce0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 28  (__APPLE__) && (
36cf0 28 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53  (__MAC_OS_X_VERS
36d00 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
36d10 20 3e 20 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20   > 1050) || \.  
36d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d30 20 20 20 20 20 20 20 20 20 20 28 5f 5f 49 50 48            (__IPH
36d40 4f 4e 45 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d  ONE_OS_VERSION_M
36d50 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20 32 30  IN_REQUIRED > 20
36d60 30 30 29 29 0a 20 20 7b 0a 20 20 20 20 73 74 72  00)).  {.    str
36d70 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d  uct timespec tim
36d80 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f  eout = {1, 0}; /
36d90 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20  * 1 sec timeout 
36da0 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f  */.    if( getho
36db0 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20  stuuid(pHostID, 
36dc0 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20  &timeout) ){.   
36dd0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
36de0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  no;.      if( pE
36df0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
36e00 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20  *pError = err;. 
36e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
36e20 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
36e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
36e40 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
36e50 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65  ETER(pError);.#e
36e60 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
36e70 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d  TE_TEST.  /* sim
36e80 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
36e90 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
36ea0 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
36eb0 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69  ile paths */.  i
36ec0 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  f( sqlite3_hosti
36ed0 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20  d_num != 0){.   
36ee0 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63   pHostID[0] = (c
36ef0 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20  har)(pHostID[0] 
36f00 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33  + (char)(sqlite3
36f10 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78  _hostid_num & 0x
36f20 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  FF));.  }.#endif
36f30 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .  .  return SQL
36f40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
36f50 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
36f60 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72  tains the header
36f70 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f  , host id and lo
36f80 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f  ck file path. */
36f90 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43  .#define PROXY_C
36fa0 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20  ONCHVERSION 2   
36fb0 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72  /* 1-byte header
36fc0 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69  , 16-byte host i
36fd0 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69  d, path */.#defi
36fe0 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  ne PROXY_HEADERL
36ff0 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e  EN    1   /* con
37000 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c  ch file header l
37010 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65  ength */.#define
37020 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
37030 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45      (PROXY_HEADE
37040 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
37050 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52  DLEN).#define PR
37060 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20  OXY_MAXCONCHLEN 
37070 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
37080 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
37090 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f  N+MAXPATHLEN)../
370a0 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f  * .** Takes an o
370b0 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  pen conch file, 
370c0 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65  copies the conte
370d0 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74  nts to a new pat
370e0 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73  h and then moves
370f0 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54   .** it back.  T
37100 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64  he newly created
37110 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73   file's file des
37120 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67  criptor is assig
37130 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ned to the.** co
37140 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75  nch file structu
37150 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74  re and finally t
37160 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63  he original conc
37170 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
37180 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e  r is .** closed.
37190 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69    Returns zero i
371a0 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
371b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
371c0 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
371d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
371e0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
371f0 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
37200 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
37210 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
37220 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
37230 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
37240 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
37250 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
37260 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20  nchFile;.  char 
37270 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  tPath[MAXPATHLEN
37280 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52  ];.  char buf[PR
37290 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
372a0 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20  ;.  char *cPath 
372b0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
372c0 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20  ePath;.  size_t 
372d0 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73  readLen = 0;.  s
372e0 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
372f0 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67  0;.  char errmsg
37300 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74  [64] = "";.  int
37310 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20   fd = -1;.  int 
37320 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45  rc = -1;.  UNUSE
37330 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f  D_PARAMETER(myHo
37340 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65  stID);..  /* cre
37350 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62  ate a new path b
37360 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72  y replace the tr
37370 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20  ailing '-conch' 
37380 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f  with '-break' */
37390 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72  .  pathLen = str
373a0 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74  lcpy(tPath, cPat
373b0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
373c0 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41    if( pathLen>MA
373d0 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68  XPATHLEN || path
373e0 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28  Len<6 || .     (
373f0 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70  strlcpy(&tPath[p
37400 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61  athLen-5], "brea
37410 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a  k", 6) != 5) ){.
37420 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
37430 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
37440 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68  sg),errmsg,"path
37450 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
37460 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a  ,(int)pathLen);.
37470 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
37480 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
37490 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20   read the conch 
374a0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61  content */.  rea
374b0 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63  dLen = osPread(c
374c0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
374d0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
374e0 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
374f0 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
37500 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71  HINDEX ){.    sq
37510 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
37520 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
37530 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72  rmsg,"read error
37540 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
37550 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  readLen);.    go
37560 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
37570 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65  ;.  }.  /* write
37580 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74   it out to the t
37590 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66  emporary break f
375a0 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f  ile */.  fd = ro
375b0 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c  bust_open(tPath,
375c0 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54   (O_RDWR|O_CREAT
375d0 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20  |O_EXCL), 0);.  
375e0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
375f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
37600 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
37610 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65   errmsg, "create
37620 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
37630 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
37640 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
37650 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74   }.  if( osPwrit
37660 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
37670 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65  en, 0) != (ssize
37680 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  _t)readLen ){.  
37690 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
376a0 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
376b0 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74  ), errmsg, "writ
376c0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
376d0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
376e0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
376f0 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
37700 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
37710 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
37720 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
37730 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
37740 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
37750 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
37760 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
37770 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
37780 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
37790 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
377a0 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
377b0 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73   cPath);.  robus
377c0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63  t_close(pFile, c
377d0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  onchFile->h, __L
377e0 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46  INE__);.  conchF
377f0 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
37800 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
37810 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
37820 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
37830 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
37840 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
37850 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  0 ){.      osUnl
37860 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20  ink(tPath);.    
37870 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
37880 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  File, fd, __LINE
37890 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  __);.    }.    f
378a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
378b0 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20  failed to break 
378c0 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
378d0 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20  , %s\n", cPath, 
378e0 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72  errmsg);.  }.  r
378f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
37900 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74  Take the request
37910 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
37920 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72  onch file and br
37930 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b  eak a stale lock
37940 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
37950 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a   id matches..*/.
37960 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
37970 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
37980 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
37990 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20  t myHostID, int 
379a0 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f  lockType){.  pro
379b0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
379c0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
379d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
379e0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
379f0 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
37a00 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
37a10 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
37a20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37a30 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72  TE_OK;.  int nTr
37a40 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  ies = 0;.  struc
37a50 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68  t timespec conch
37a60 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65  ModTime;.  .  me
37a70 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69  mset(&conchModTi
37a80 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f  me, 0, sizeof(co
37a90 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20  nchModTime));.  
37aa0 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  do {.    rc = co
37ab0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
37ac0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
37ad0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
37ae0 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
37af0 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20   nTries ++;.    
37b00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
37b10 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  USY ){.      /* 
37b20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  If the lock fail
37b30 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20  ed (busy):.     
37b40 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74    * 1st try: get
37b50 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66   the mod time of
37b60 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74   the conch, wait
37b70 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67   0.5s and try ag
37b80 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32  ain. .       * 2
37b90 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20  nd try: fail if 
37ba0 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61  the mod time cha
37bb0 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20  nged or host id 
37bc0 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61  is different, wa
37bd0 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20  it .       *    
37be0 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e         10 sec an
37bf0 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20  d try again.    
37c00 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72     * 3rd try: br
37c10 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c  eak the lock unl
37c20 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  ess the mod time
37c30 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20   has changed..  
37c40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
37c50 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
37c60 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
37c70 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26  (conchFile->h, &
37c80 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  buf) ){.        
37c90 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
37ca0 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
37cb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37cc0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
37cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
37ce0 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d       if( nTries=
37cf0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
37d00 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66  nchModTime = buf
37d10 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20  .st_mtimespec;. 
37d20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30         usleep(50
37d30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30  0000); /* wait 0
37d40 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74  .5 sec and try t
37d50 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a  he lock again*/.
37d60 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
37d70 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;  .      }..   
37d80 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
37d90 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  s>1 );.      if(
37da0 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
37db0 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d  _sec != buf.st_m
37dc0 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20  timespec.tv_sec 
37dd0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e  || .         con
37de0 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65  chModTime.tv_nse
37df0 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  c != buf.st_mtim
37e00 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b  espec.tv_nsec ){
37e10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37e20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
37e30 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
37e40 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20    if( nTries==2 
37e50 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61  ){  .        cha
37e60 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58  r tBuf[PROXY_MAX
37e70 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20  CONCHLEN];.     
37e80 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50     int len = osP
37e90 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
37ea0 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d  h, tBuf, PROXY_M
37eb0 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a  AXCONCHLEN, 0);.
37ec0 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c          if( len<
37ed0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
37ee0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
37ef0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
37f00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
37f10 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
37f20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37f30 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59     if( len>PROXY
37f40 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42  _PATHINDEX && tB
37f50 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f  uf[0]==(char)PRO
37f60 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29  XY_CONCHVERSION)
37f70 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
37f80 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
37f90 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20  ock if the host 
37fa0 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  id doesn't match
37fb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
37fc0 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75  ( 0!=memcmp(&tBu
37fd0 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
37fe0 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52  N], myHostID, PR
37ff0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29  OXY_HOSTIDLEN) )
38000 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
38010 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
38020 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
38030 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
38040 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
38050 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f  break the lock o
38060 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20  n short read or 
38070 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74  a version mismat
38080 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
38090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
380a0 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SY;.        }.  
380b0 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30        usleep(100
380c0 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
380d0 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74  10 sec and try t
380e0 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f  he lock again */
380f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
38100 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e; .      }.    
38110 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28    .      assert(
38120 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20   nTries==3 );.  
38130 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79      if( 0==proxy
38140 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70  BreakConchLock(p
38150 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20  File, myHostID) 
38160 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
38180 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
38190 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
381a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
381b0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
381c0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
381d0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
381e0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43  File, SHARED_LOC
381f0 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20  K);          .  
38200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
38210 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
38220 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
38230 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
38240 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
38250 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
38260 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20  ckType);.       
38270 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
38280 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d  .  } while( rc==
38290 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e  SQLITE_BUSY && n
382a0 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20  Tries<3 );.  .  
382b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
382c0 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68   Takes the conch
382d0 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61   by taking a sha
382e0 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61  red lock and rea
382f0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63  d the contents c
38300 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63  onch, if .** loc
38310 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c  kPath is non-NUL
38320 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  L, the host ID a
38330 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
38340 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41  h must match.  A
38350 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61   NULL .** lockPa
38360 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  th means that th
38370 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68  e lockPath in th
38380 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
38390 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  l be used if the
383a0 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61   .** host IDs ma
383b0 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f  tch, or a new lo
383c0 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
383d0 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61  generated automa
383e0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20  tically .** and 
383f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
38400 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  onch file..*/.st
38410 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61  atic int proxyTa
38420 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  keConch(unixFile
38430 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78   *pFile){.  prox
38440 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
38450 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
38460 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
38470 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
38480 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20  text; .  .  if( 
38490 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21  pCtx->conchHeld!
384a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
384b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
384c0 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
384d0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
384e0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
384f0 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73      uuid_t myHos
38500 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72  tID;.    int pEr
38510 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ror = 0;.    cha
38520 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f  r readBuf[PROXY_
38530 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
38540 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b    char lockPath[
38550 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20  MAXPATHLEN];.   
38560 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50   char *tempLockP
38570 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ath = NULL;.    
38580 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc =