/ Hex Artifact Content
Login

Artifact e68c8e77e47ce38865ebf8e1a0e877ac955f469c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
0cd0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63 6c  S_VXWORKS.# incl
0ce0: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0cf0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d  >.# include <sem
0d00: 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e 63 6c  aphore.h>.# incl
0d10: 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23  ude <limits.h>.#
0d20: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
0d30: 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  RKS */..#if defi
0d40: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
0d50: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
0d60: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20  LOCKING_STYLE.# 
0d70: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75  include <sys/mou
0d80: 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  nt.h>.#endif..#i
0d90: 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a  fdef HAVE_UTIME.
0da0: 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d 65  # include <utime
0db0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .h>.#endif../*.*
0dc0: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
0dd0: 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73 46   of unixFile.fsF
0de0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
0df0: 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
0e00: 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31 0a  S_MSDOS     0x1.
0e10: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
0e20: 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61   to be thread-sa
0e30: 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20  fe, include the 
0e40: 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20  pthreads header 
0e50: 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68  and define.** th
0e60: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
0e70: 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  READS macro..*/.
0e80: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
0e90: 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20  DSAFE.# include 
0ea0: 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65  <pthread.h>.# de
0eb0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58  fine SQLITE_UNIX
0ec0: 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69  _THREADS 1.#endi
0ed0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  f../*.** Default
0ee0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65   permissions whe
0ef0: 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77  n creating a new
0f00: 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66   file.*/.#ifndef
0f10: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
0f20: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
0f30: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
0f40: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
0f50: 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23  RMISSIONS 0644.#
0f60: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
0f70: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
0f80: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
0f90: 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a 2f  uto proxy dir.*/
0fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0fb0: 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
0fc0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64  _PERMISSIONS.# d
0fd0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46  efine SQLITE_DEF
0fe0: 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
0ff0: 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a 23  RMISSIONS 0755.#
1000: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  endif../*.** Max
1010: 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
1020: 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23  ath-length..*/.#
1030: 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e  define MAX_PATHN
1040: 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c 77 61  AME 512../* Alwa
1050: 79 73 20 63 61 73 74 20 74 68 65 20 67 65 74 70  ys cast the getp
1060: 69 64 28 29 20 72 65 74 75 72 6e 20 74 79 70 65  id() return type
1070: 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69   for compatibili
1080: 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72 6e 65  ty with.** kerne
1090: 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56 78 57  l modules in VxW
10a0: 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  orks. */.#define
10b0: 20 6f 73 47 65 74 70 69 64 28 58 29 20 28 70 69   osGetpid(X) (pi
10c0: 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a 2f 2a  d_t)getpid()../*
10d0: 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65  .** Only set the
10e0: 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68   lastErrno if th
10f0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1100: 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64  a real error and
1110: 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61   not .** a norma
1120: 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  l expected retur
1130: 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45  n code of SQLITE
1140: 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f  _BUSY or SQLITE_
1150: 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53  OK.*/.#define IS
1160: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20  _LOCK_ERROR(x)  
1170: 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ((x != SQLITE_OK
1180: 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54  ) && (x != SQLIT
1190: 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72  E_BUSY))../* For
11a0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
11b0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
11c0: 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53 68  t unixShm unixSh
11d0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
11e0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73   /* Connection s
11f0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1200: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1210: 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53  nixShmNode unixS
1220: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a  hmNode;       /*
1230: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   Shared memory i
1240: 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64  nstance */.typed
1250: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49 6e  ef struct unixIn
1260: 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64  odeInfo unixInod
1270: 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69  eInfo;   /* An i
1280: 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65 66  -node */.typedef
1290: 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73   struct UnixUnus
12a0: 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46  edFd UnixUnusedF
12b0: 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75  d;     /* An unu
12c0: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
12d0: 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f  tor */../*.** So
12e0: 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61  metimes, after a
12f0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20   file handle is 
1300: 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65  closed by SQLite
1310: 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  , the file descr
1320: 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20  iptor.** cannot 
1330: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
1340: 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20  ately. In these 
1350: 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73  cases, instances
1360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1370: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61  g.** structure a
1380: 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  re used to store
1390: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
13a0: 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69  ptor while waiti
13b0: 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70  ng for an.** opp
13c0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68  ortunity to eith
13d0: 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73  er close or reus
13e0: 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  e it..*/.struct 
13f0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20  UnixUnusedFd {. 
1400: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
1410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1420: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1430: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20   close */.  int 
1440: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
1450: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
1460: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
1470: 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77  tor was opened w
1480: 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  ith */.  UnixUnu
1490: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20  sedFd *pNext;   
14a0: 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65     /* Next unuse
14b0: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
14c0: 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a  r on same file *
14d0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
14e0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
14f0: 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f  re is subclass o
1500: 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  f sqlite3_file s
1510: 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 75  pecific to the u
1520: 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65  nix.** VFS imple
1530: 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74  mentations..*/.t
1540: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1550: 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b  ixFile unixFile;
1560: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
1570: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f   {.  sqlite3_io_
1580: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
1590: 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61  Method;  /* Alwa
15a0: 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ys the first ent
15b0: 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ry */.  sqlite3_
15c0: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15e0: 68 65 20 56 46 53 20 74 68 61 74 20 63 72 65 61  he VFS that crea
15f0: 74 65 64 20 74 68 69 73 20 75 6e 69 78 46 69 6c  ted this unixFil
1600: 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
1610: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
1620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1630: 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f  fo about locks o
1640: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
1650: 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20    int h;        
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
1680: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1690: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
16a0: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
16b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70        /* The typ
16c0: 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  e of lock held o
16d0: 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75  n this fd */.  u
16e0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
16f0: 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20  t ctrlFlags;    
1700: 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c     /* Behavioral
1710: 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45   bits.  UNIXFILE
1720: 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  _* flags */.  in
1730: 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  t lastErrno;    
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72    /* The unix er
1760: 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f  rno from last I/
1770: 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69  O error */.  voi
1780: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
1790: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
17a0: 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c   /* Locking styl
17b0: 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  e specific state
17c0: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
17d0: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
17e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
17f0: 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55  -allocated UnixU
1800: 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e  nusedFd */.  con
1810: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20  st char *zPath; 
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1840: 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
1850: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1870: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   Shared memory s
1880: 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69  egment informati
1890: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68  on */.  int szCh
18a0: 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  unk;            
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
18c0: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
18d0: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
18e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
18f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1900: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1930: 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
1940: 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69  h refs */.  sqli
1950: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
1960: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1970: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
1980: 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61  f mapping at pMa
1990: 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  pRegion */.  sql
19a0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
19b0: 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 20  izeActual;      
19c0: 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20   /* Actual size 
19d0: 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d  of mapping at pM
19e0: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  apRegion */.  sq
19f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1a00: 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20 20 20  SizeMax;        
1a10: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20    /* Configured 
1a20: 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20  FCNTL_MMAP_SIZE 
1a30: 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20  value */.  void 
1a40: 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20  *pMapRegion;    
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a60: 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  * Memory mapped 
1a70: 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66  region */.#endif
1a80: 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1a90: 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  __.  int sectorS
1aa0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
1ac0: 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a  ce sector size *
1ad0: 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65 43 68  /.  int deviceCh
1ae0: 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 20 20  aracteristics;  
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f          /* Preco
1b00: 6d 70 75 74 65 64 20 64 65 76 69 63 65 20 63 68  mputed device ch
1b10: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
1b20: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1b30: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1b40: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
1b50: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b70: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1b80: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1b90: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1ba0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1bb0: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
1bc0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1bd0: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
1be0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1bf0: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
1c00: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
1c10: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
1c20: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1c30: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
1c40: 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20  leId *pId;      
1c50: 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69      /* Unique fi
1c60: 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a  le ID */.#endif.
1c70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c80: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  BUG.  /* The nex
1c90: 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61  t group of varia
1ca0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  bles are used to
1cb0: 20 74 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f   track whether o
1cc0: 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74  r not the.  ** t
1cd0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1ce0: 65 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32  er in bytes 24-2
1cf0: 37 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  7 of database fi
1d00: 6c 65 73 20 61 72 65 20 75 70 64 61 74 65 64 0a  les are updated.
1d10: 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e    ** whenever an
1d20: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
1d30: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
1d40: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
1d50: 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63  ult will.  ** oc
1d60: 63 75 72 20 69 66 20 61 20 66 69 6c 65 20 69 73  cur if a file is
1d70: 20 75 70 64 61 74 65 64 20 77 69 74 68 6f 75 74   updated without
1d80: 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74   also updating t
1d90: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
1da0: 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68   ** counter.  Th
1db0: 69 73 20 74 65 73 74 20 69 73 20 6d 61 64 65 20  is test is made 
1dc0: 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f  to avoid new pro
1dd0: 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f  blems similar to
1de0: 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65   the.  ** one de
1df0: 73 63 72 69 62 65 64 20 62 79 20 74 69 63 6b 65  scribed by ticke
1e00: 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20  t #3584. .  */. 
1e10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
1e20: 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20  ransCntrChng;   
1e30: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
1e40: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1e50: 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  er changed */.  
1e60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 62  unsigned char db
1e70: 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f  Update;        /
1e80: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
1e90: 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  rt of database f
1ea0: 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ile changed */. 
1eb0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
1ec0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20  nNormalWrite;   
1ed0: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 20  /* True if in a 
1ee0: 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65  normal write ope
1ef0: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69  ration */..#endi
1f00: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1f10: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
1f20: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
1f30: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1f40: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
1f50: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
1f60: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
1f70: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
1f80: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
1f90: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
1fa0: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
1fb0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
1fc0: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c  ./* This variabl
1fd0: 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72 6f 63  e holds the proc
1fe0: 65 73 73 20 69 64 20 28 70 69 64 29 20 66 72 6f  ess id (pid) fro
1ff0: 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61 6e 64  m when the xRand
2000: 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65 74 68  omness().** meth
2010: 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 20  od was called.  
2020: 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20 63 61  If xOpen() is ca
2030: 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69 66 66  lled from a diff
2040: 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20 69 64  erent process id
2050: 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
2060: 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20 68 61  that a fork() ha
2070: 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 20  s occurred, the 
2080: 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72 65 73  PRNG will be res
2090: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 70 69  et..*/.static pi
20a0: 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  d_t randomnessPi
20b0: 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c  d = 0;../*.** Al
20c0: 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72  lowed values for
20d0: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74   the unixFile.ct
20e0: 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a  rlFlags bitmask:
20f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
2100: 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20  FILE_EXCL       
2110: 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e   0x01     /* Con
2120: 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e  nections from on
2130: 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a  e process only *
2140: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2150: 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30  LE_RDONLY      0
2160: 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x02     /* Conne
2170: 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e  ction is read on
2180: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ly */.#define UN
2190: 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  IXFILE_PERSIST_W
21a0: 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50  AL 0x04     /* P
21b0: 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f  ersistent WAL mo
21c0: 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  de */.#ifndef SQ
21d0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
21e0: 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e  SYNC.# define UN
21f0: 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20  IXFILE_DIRSYNC  
2200: 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69    0x08     /* Di
2210: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65  rectory sync nee
2220: 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64  ded */.#else.# d
2230: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
2240: 49 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23  IRSYNC    0x00.#
2250: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e  endif.#define UN
2260: 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20  IXFILE_PSOW     
2270: 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53     0x10     /* S
2280: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
2290: 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
22a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
22b0: 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20  ILE_DELETE      
22c0: 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65  0x20     /* Dele
22d0: 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23  te on close */.#
22e0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
22f0: 55 52 49 20 20 20 20 20 20 20 20 20 30 78 34 30  URI         0x40
2300: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
2310: 20 6d 69 67 68 74 20 68 61 76 65 20 71 75 65 72   might have quer
2320: 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  y parameters */.
2330: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2340: 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38  _NOLOCK      0x8
2350: 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66  0     /* Do no f
2360: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 23  ile locking */.#
2370: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2380: 57 41 52 4e 45 44 20 20 20 20 30 78 30 31 30 30  WARNED    0x0100
2390: 20 20 20 20 20 2f 2a 20 76 65 72 69 66 79 44 62       /* verifyDb
23a0: 46 69 6c 65 28 29 20 77 61 72 6e 69 6e 67 73 20  File() warnings 
23b0: 69 73 73 75 65 64 20 2a 2f 0a 23 64 65 66 69 6e  issued */.#defin
23c0: 65 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b  e UNIXFILE_BLOCK
23d0: 20 20 20 20 20 30 78 30 32 30 30 20 20 20 20 20       0x0200     
23e0: 2f 2a 20 4e 65 78 74 20 53 48 4d 20 6c 6f 63 6b  /* Next SHM lock
23f0: 20 6d 69 67 68 74 20 62 6c 6f 63 6b 20 2a 2f 0a   might block */.
2400: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
2410: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
2420: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
2430: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
2440: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2450: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
2460: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
2470: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
2480: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
2490: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
24a0: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
24b0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
24c0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
24d0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
24e0: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
24f0: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
2500: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2510: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
2520: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
2530: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
2540: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2550: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
2560: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
2570: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
2580: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2590: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
25a0: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
25b0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
25c0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
25d0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
25e0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
25f0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2600: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2610: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2620: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
2630: 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50  *.** HAVE_MREMAP
2640: 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75   defaults to tru
2650: 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66  e on Linux and f
2660: 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65 20  alse everywhere 
2670: 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  else..*/.#if !de
2680: 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41  fined(HAVE_MREMA
2690: 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28  P).# if defined(
26a0: 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
26b0: 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43  fined(_GNU_SOURC
26c0: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  E).#  define HAV
26d0: 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73  E_MREMAP 1.# els
26e0: 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45  e.#  define HAVE
26f0: 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69  _MREMAP 0.# endi
2700: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
2710: 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 20  Explicitly call 
2720: 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73 69  the 64-bit versi
2730: 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f 6e  on of lseek() on
2740: 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72 77   Android. Otherw
2750: 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a 20  ise, lseek().** 
2760: 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76 65  is the 32-bit ve
2770: 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20 5f  rsion, even if _
2780: 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53  FILE_OFFSET_BITS
2790: 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  =64 is defined..
27a0: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52  */.#ifdef __ANDR
27b0: 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20 6c  OID__.# define l
27c0: 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65 6e  seek lseek64.#en
27d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65  dif../*.** Diffe
27e0: 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d  rent Unix system
27f0: 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29  s declare open()
2800: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61   in different wa
2810: 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a  ys.  Same use.**
2820: 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72   open(const char
2830: 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20  *,int,mode_t).  
2840: 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28  Others use open(
2850: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2860: 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66  ...)..** The dif
2870: 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72  ference is impor
2880: 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20  tant when using 
2890: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
28a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
28b0: 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20   The safest way 
28c0: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  to deal with the
28d0: 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61   problem is to a
28e0: 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77  lways use this w
28f0: 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20  rapper.** which 
2900: 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73  always has the s
2910: 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64  ame well-defined
2920: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
2930: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f  tatic int posixO
2940: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
2950: 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  zFile, int flags
2960: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72  , int mode){.  r
2970: 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65  eturn open(zFile
2980: 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a  , flags, mode);.
2990: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65  }../*.** On some
29a0: 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20   systems, calls 
29b0: 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c  to fchown() will
29c0: 20 74 72 69 67 67 65 72 20 61 20 6d 65 73 73 61   trigger a messa
29d0: 67 65 20 69 6e 20 61 20 73 65 63 75 72 69 74 79  ge in a security
29e0: 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20  .** log if they 
29f0: 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f  come from non-ro
2a00: 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53  ot processes.  S
2a10: 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20  o avoid calling 
2a20: 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77  fchown() if.** w
2a30: 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e  e are not runnin
2a40: 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74  g as root..*/.st
2a50: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 46 63  atic int posixFc
2a60: 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64  hown(int fd, uid
2a70: 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69  _t uid, gid_t gi
2a80: 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d){.#if OS_VXWOR
2a90: 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  KS.  return 0;.#
2aa0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 67 65  else.  return ge
2ab0: 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20 66 63  teuid() ? 0 : fc
2ac0: 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29  hown(fd,uid,gid)
2ad0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 46  ;.#endif.}../* F
2ae0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
2af0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2b00: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
2b10: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b  st char*, int*);
2b20: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2b30: 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64  Getpagesize(void
2b40: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  );../*.** Many s
2b50: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
2b60: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
2b70: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
2b80: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
2b90: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
2ba0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
2bb0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
2bc0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
2bd0: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
2be0: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
2bf0: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
2c00: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
2c10: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
2c20: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
2c30: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
2c40: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
2c50: 74 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f  tic struct unix_
2c60: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
2c70: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
2c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2c90: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
2ca0: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
2cb0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43  3_syscall_ptr pC
2cc0: 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65  urrent; /* Curre
2cd0: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
2ce0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
2cf0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2d00: 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f  _ptr pDefault; /
2d10: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
2d20: 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20  */.} aSyscall[] 
2d30: 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20  = {.  { "open", 
2d40: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2d50: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
2d60: 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23  ixOpen,  0  },.#
2d70: 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20  define osOpen   
2d80: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2d90: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29  t char*,int,int)
2da0: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
2db0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f  rrent)..  { "clo
2dc0: 73 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  se",        (sql
2dd0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2de0: 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20  )close,      0  
2df0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f  },.#define osClo
2e00: 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  se     ((int(*)(
2e10: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d  int))aSyscall[1]
2e20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2e30: 22 61 63 63 65 73 73 22 2c 20 20 20 20 20 20 20  "access",       
2e40: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2e50: 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20 20 20  _ptr)access,    
2e60: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2e70: 73 41 63 63 65 73 73 20 20 20 20 28 28 69 6e 74  sAccess    ((int
2e80: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
2e90: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d  int))aSyscall[2]
2ea0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2eb0: 22 67 65 74 63 77 64 22 2c 20 20 20 20 20 20 20  "getcwd",       
2ec0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2ed0: 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20 20 20  _ptr)getcwd,    
2ee0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2ef0: 73 47 65 74 63 77 64 20 20 20 20 28 28 63 68 61  sGetcwd    ((cha
2f00: 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65  r*(*)(char*,size
2f10: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e  _t))aSyscall[3].
2f20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2f30: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 28  stat",         (
2f40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2f50: 70 74 72 29 73 74 61 74 2c 20 20 20 20 20 20 20  ptr)stat,       
2f60: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2f70: 53 74 61 74 20 20 20 20 20 20 28 28 69 6e 74 28  Stat      ((int(
2f80: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  *)(const char*,s
2f90: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
2fa0: 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e  scall[4].pCurren
2fb0: 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a  t)../*.** The DJ
2fc0: 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76  GPP compiler env
2fd0: 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d  ironment looks m
2fe0: 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c  ostly like Unix,
2ff0: 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73   but it.** lacks
3000: 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   the fcntl() sys
3010: 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65  tem call.  So re
3020: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74  define fcntl() t
3030: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  o be something.*
3040: 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75  * that always su
3050: 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65  cceeds.  This me
3060: 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67  ans that locking
3070: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
3080: 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20  under.** DJGPP. 
3090: 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d   But it is DOS -
30a0: 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78   what did you ex
30b0: 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20  pect?.*/.#ifdef 
30c0: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66  __DJGPP__.  { "f
30d0: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c  stat",        0,
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3100: 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20  sFstat(a,b,c)   
3110: 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20   0.#else     .  
3120: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
3130: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3140: 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20  ll_ptr)fstat,   
3150: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3160: 20 6f 73 46 73 74 61 74 20 20 20 20 20 28 28 69   osFstat     ((i
3170: 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74  nt(*)(int,struct
3180: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
3190: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  [5].pCurrent).#e
31a0: 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e  ndif..  { "ftrun
31b0: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
31c0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
31d0: 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c  truncate,  0  },
31e0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e  .#define osFtrun
31f0: 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e  cate ((int(*)(in
3200: 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c  t,off_t))aSyscal
3210: 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[6].pCurrent)..
3220: 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20    { "fcntl",    
3230: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3240: 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20  call_ptr)fcntl, 
3250: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3260: 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28  ne osFcntl     (
3270: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c  (int(*)(int,int,
3280: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  ...))aSyscall[7]
3290: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
32a0: 22 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 20  "read",         
32b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
32c0: 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20 20 20  _ptr)read,      
32d0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
32e0: 73 52 65 61 64 20 20 20 20 20 20 28 28 73 73 69  sRead      ((ssi
32f0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
3300: 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61  *,size_t))aSysca
3310: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
3320: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
3330: 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54  _PREAD) || SQLIT
3340: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
3350: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61  _STYLE.  { "prea
3360: 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  d",        (sqli
3370: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3380: 70 72 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d  pread,      0  }
3390: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65  ,.#else.  { "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 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
33d0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
33e0: 65 20 6f 73 50 72 65 61 64 20 20 20 20 20 28 28  e osPread     ((
33f0: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
3400: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3410: 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  t))aSyscall[9].p
3420: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3430: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
3440: 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22  4).  { "pread64"
3450: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
3460: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61  syscall_ptr)prea
3470: 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65  d64,    0  },.#e
3480: 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34  lse.  { "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 30 2c 20  _syscall_ptr)0, 
34b0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
34c0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
34d0: 50 72 65 61 64 36 34 20 20 20 28 28 73 73 69 7a  Pread64   ((ssiz
34e0: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
34f0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61  ,size_t,off_t))a
3500: 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72  Syscall[10].pCur
3510: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74  rent)..  { "writ
3520: 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  e",        (sqli
3530: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3540: 77 72 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d  write,      0  }
3550: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74  ,.#define osWrit
3560: 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28  e     ((ssize_t(
3570: 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  *)(int,const voi
3580: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
3590: 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74  all[11].pCurrent
35a0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
35b0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
35c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
35d0: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77  NG_STYLE.  { "pw
35e0: 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71  rite",       (sq
35f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3600: 72 29 70 77 72 69 74 65 2c 20 20 20 20 20 30 20  r)pwrite,     0 
3610: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3620: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73  write",       (s
3630: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3640: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3650: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3660: 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20 20 20  ine osPwrite    
3670: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3680: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3690: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43   aSyscall[12].pC
36c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
36d0: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
36e0: 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22  ).  { "pwrite64"
36f0: 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ,     (sqlite3_s
3700: 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74  yscall_ptr)pwrit
3710: 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c  e64,   0  },.#el
3720: 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34  se.  { "pwrite64
3730: 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ",     (sqlite3_
3740: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3750: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3760: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3770: 77 72 69 74 65 36 34 20 20 28 28 73 73 69 7a 65  write64  ((ssize
3780: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
3790: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
37a0: 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20  _t))\.          
37b0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
37c0: 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[13].pCurrent)
37d0: 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20  ..  { "fchmod", 
37e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
37f0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f  yscall_ptr)fchmo
3800: 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  d,     0  },.#de
3810: 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20  fine osFchmod   
3820: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f   ((int(*)(int,mo
3830: 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  de_t))aSyscall[1
3840: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
3850: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
3860: 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
3870: 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
3880: 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c  LLOCATE.  { "fal
3890: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
38a0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
38b0: 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65  )posix_fallocate
38c0: 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  ,  0 },.#else.  
38d0: 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20  { "fallocate",  
38e0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
38f0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3900: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3910: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46  ndif.#define osF
3920: 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a  allocate ((int(*
3930: 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f  )(int,off_t,off_
3940: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  t))aSyscall[15].
3950: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3960: 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28  unlink",       (
3970: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3980: 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20  ptr)unlink,     
3990: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
39a0: 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28  ne osUnlink    (
39b0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
39c0: 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36  ar*))aSyscall[16
39d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
39e0: 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22   "openDirectory"
39f0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3a00: 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69  scall_ptr)openDi
3a10: 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20  rectory,      0 
3a20: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65  },.#define osOpe
3a30: 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74  nDirectory ((int
3a40: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
3a50: 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  int*))aSyscall[1
3a60: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3a70: 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20  { "mkdir",      
3a80: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3a90: 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20  ll_ptr)mkdir,   
3aa0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3ab0: 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20  fine osMkdir    
3ac0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3ad0: 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53  char*,mode_t))aS
3ae0: 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72  yscall[18].pCurr
3af0: 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72  ent)..  { "rmdir
3b00: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
3b10: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72  e3_syscall_ptr)r
3b20: 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20  mdir,           
3b30: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52  0 },.#define osR
3b40: 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a  mdir     ((int(*
3b50: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  )(const char*))a
3b60: 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72  Syscall[19].pCur
3b70: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f  rent)..  { "fcho
3b80: 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wn",       (sqli
3b90: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3ba0: 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20 20 20  posixFchown,    
3bb0: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3bc0: 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28  Fchown    ((int(
3bd0: 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64  *)(int,uid_t,gid
3be0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d  _t))aSyscall[20]
3bf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3c00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3c10: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
3c20: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
3c30: 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20  E>0.  { "mmap", 
3c40: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3c50: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c  yscall_ptr)mmap,
3c60: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3c70: 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a  e osMmap ((void*
3c80: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
3c90: 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66  ,int,int,int,off
3ca0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d  _t))aSyscall[21]
3cb0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3cc0: 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20  "munmap",       
3cd0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3ce0: 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20  _ptr)munmap,    
3cf0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
3d00: 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f  ne osMunmap ((vo
3d10: 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a  id*(*)(void*,siz
3d20: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  e_t))aSyscall[22
3d30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3d40: 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b   HAVE_MREMAP.  {
3d50: 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20   "mremap",      
3d60: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3d70: 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20  l_ptr)mremap,   
3d80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3d90: 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20  e.  { "mremap", 
3da0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3db0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3dd0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3de0: 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a  osMremap ((void*
3df0: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
3e00: 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29  ,size_t,int,...)
3e10: 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43  )aSyscall[23].pC
3e20: 75 72 72 65 6e 74 29 0a 20 20 7b 20 22 67 65 74  urrent).  { "get
3e30: 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c  pagesize",  (sql
3e40: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3e50: 29 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65  )unixGetpagesize
3e60: 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f  , 0 },.#define o
3e70: 73 47 65 74 70 61 67 65 73 69 7a 65 20 28 28 69  sGetpagesize ((i
3e80: 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73  nt(*)(void))aSys
3e90: 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e  call[24].pCurren
3ea0: 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20 2f  t)..#endif..}; /
3eb0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  * End of the ove
3ec0: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
3ed0: 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   calls */../*.**
3ee0: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65   This is the xSe
3ef0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65  tSystemCall() me
3f00: 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f  thod of sqlite3_
3f10: 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  vfs for all of t
3f20: 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53  he.** "unix" VFS
3f30: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
3f40: 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65  TE_OK opon succe
3f50: 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67  ssfully updating
3f60: 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63   the.** system c
3f70: 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20  all pointer, or 
3f80: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
3f90: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
3fa0: 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73  onfigurable.** s
3fb0: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64  ystem call named
3fc0: 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   zName..*/.stati
3fd0: 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73  c int unixSetSys
3fe0: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
3ff0: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
4000: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
4010: 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f  VFS pointer.  No
4020: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
4030: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
4040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4050: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
4060: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
4070: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
4080: 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20  l_ptr pNewFunc  
4090: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
40a0: 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61  w system call va
40b0: 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  lue */.){.  unsi
40c0: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e  gned int i;.  in
40d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
40e0: 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45  TFOUND;..  UNUSE
40f0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
4100: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Used);.  if( zNa
4110: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
4120: 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67  If no zName is g
4130: 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c  iven, restore al
4140: 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74  l system calls t
4150: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a  o their default.
4160: 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20      ** settings 
4170: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  and return NULL.
4180: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
4190: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66  SQLITE_OK;.    f
41a0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
41b0: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
41c0: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
41d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
41e0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
41f0: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
4200: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4210: 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  rent = aSyscall[
4220: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
4230: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
4240: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  se{.    /* If zN
4250: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
4260: 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c  , operate on onl
4270: 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d  y the one system
4280: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65   call.    ** spe
4290: 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
42a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
42b0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
42c0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
42d0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
42e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
42f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4300: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
4310: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
4320: 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29  i].pDefault==0 )
4330: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73  {.          aSys
4340: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
4350: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
4360: 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  Current;.       
4370: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
4380: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
4390: 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d     if( pNewFunc=
43a0: 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20  =0 ) pNewFunc = 
43b0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
43c0: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53  ault;.        aS
43d0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
43e0: 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20  nt = pNewFunc;. 
43f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4400: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4410: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4420: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4430: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74   value of a syst
4440: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
4450: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69   NULL if zName i
4460: 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67  s not a.** recog
4470: 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c  nized system cal
4480: 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73  l name.  NULL is
4490: 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
44a0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
44b0: 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  l.** is currentl
44c0: 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  y undefined..*/.
44d0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
44e0: 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47  yscall_ptr unixG
44f0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
4500: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
4510: 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63  tUsed,.  const c
4520: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
4530: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
4540: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
4550: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
4560: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
4570: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
4580: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
4590: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
45a0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
45b0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
45c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  ==0 ) return aSy
45d0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
45e0: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
45f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
4600: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
4610: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
4620: 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65  call after zName
4630: 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c  .  If zName==NUL
4640: 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  L.** then return
4650: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4660: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
4670: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
4680: 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20   if zName.** is 
4690: 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20  the last system 
46a0: 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65  call or if zName
46b0: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
46c0: 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73   of a valid.** s
46d0: 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  ystem call..*/.s
46e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
46f0: 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d   *unixNextSystem
4700: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
4710: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4720: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
4730: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
4740: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
4750: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
4760: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
4770: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
4780: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
4790: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
47a0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
47b0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
47c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
47d0: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
47e0: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
47f0: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
4800: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
4810: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
4820: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
4830: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4840: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ../*.** Do not a
4850: 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64  ccept any file d
4860: 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74  escriptor less t
4870: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
4880: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
4890: 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74  d.** opening dat
48a0: 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67  abase file using
48b0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
48c0: 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
48d0: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a  nly used for .**
48e0: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c   standard input,
48f0: 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72   output, and err
4900: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  or..*/.#ifndef S
4910: 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49  QLITE_MINIMUM_FI
4920: 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20  LE_DESCRIPTOR.# 
4930: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49  define SQLITE_MI
4940: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
4950: 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a  IPTOR 3.#endif..
4960: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
4970: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
4980: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
4990: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
49a0: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
49b0: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
49c0: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
49d0: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
49e0: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
49f0: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
4a00: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
4a10: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
4a20: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
4a30: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
4a40: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
4a50: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
4a60: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
4a70: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
4a80: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
4a90: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
4aa0: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
4ab0: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
4ac0: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
4ad0: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
4ae0: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
4af0: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
4b00: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
4b10: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
4b20: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
4b30: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
4b40: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
4b50: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
4b60: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
4b70: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
4b80: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
4b90: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
4ba0: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
4bb0: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
4bc0: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
4bd0: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
4be0: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
4bf0: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
4c00: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
4c10: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
4c20: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
4c30: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
4c40: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
4c50: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
4c60: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
4c70: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
4c80: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
4c90: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
4ca0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
4cb0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
4cc0: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
4cd0: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
4ce0: 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f   mode_t m2 = m ?
4cf0: 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   m : SQLITE_DEFA
4d00: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4d10: 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29  IONS;.  while(1)
4d20: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
4d30: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
4d40: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
4d50: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
4d60: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
4d70: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
4d80: 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  f.    if( fd<0 )
4d90: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
4da0: 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69  o==EINTR ) conti
4db0: 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nue;.      break
4dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4dd0: 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  fd>=SQLITE_MINIM
4de0: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
4df0: 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OR ) break;.    
4e00: 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20  osClose(fd);.   
4e10: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
4e20: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20  ITE_WARNING, .  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61                "a
4e40: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c  ttempt to open \
4e50: 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65  "%s\" as file de
4e60: 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c  scriptor %d", z,
4e70: 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d   fd);.    fd = -
4e80: 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65  1;.    if( osOpe
4e90: 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66  n("/dev/null", f
4ea0: 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , m)<0 ) break;.
4eb0: 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20    }.  if( fd>=0 
4ec0: 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20  ){.    if( m!=0 
4ed0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
4ee0: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
4ef0: 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
4f00: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30  fd, &statbuf)==0
4f10: 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74   .       && stat
4f20: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20  buf.st_size==0. 
4f30: 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75        && (statbu
4f40: 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21  f.st_mode&0777)!
4f50: 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =m .      ){.   
4f60: 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64       osFchmod(fd
4f70: 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , m);.      }.  
4f80: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
4f90: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
4fa0: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
4fb0: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
4fc0: 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c  ==0).    osFcntl
4fd0: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
4fe0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
4ff0: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
5000: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  EC);.#endif.  }.
5010: 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a    return fd;.}..
5020: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
5030: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
5040: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
5050: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
5060: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
5070: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
5080: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
5090: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
50a0: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
50b0: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
50c0: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
50d0: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
50e0: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
50f0: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
5100: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
5110: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
5120: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
5130: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
5140: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
5150: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
5160: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
5170: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
5180: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
5190: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
51a0: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
51b0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
51c0: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
51d0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
51e0: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
51f0: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
5200: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
5210: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
5220: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
5230: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
5240: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
5250: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
5260: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
5270: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
5280: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
5290: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
52a0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
52b0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
52c0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
52d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
52e0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
52f0: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
5300: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
5310: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5320: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
5330: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
5340: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
5350: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  }.#endif...#if d
5360: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
5370: 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
5380: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
5390: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
53a0: 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  on for printing 
53b0: 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d  out trace inform
53c0: 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67  ation from debug
53d0: 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73  ging.** binaries
53e0: 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  . This returns t
53f0: 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
5400: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
5410: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
5420: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
5430: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
5440: 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28  har *azFileLock(
5450: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
5460: 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c    switch( eFileL
5470: 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ock ){.    case 
5480: 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NO_LOCK: return 
5490: 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65  "NONE";.    case
54a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65   SHARED_LOCK: re
54b0: 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20  turn "SHARED";. 
54c0: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
54d0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52  _LOCK: return "R
54e0: 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61  ESERVED";.    ca
54f0: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
5500: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
5510: 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c  ";.    case EXCL
5520: 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75  USIVE_LOCK: retu
5530: 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a  rn "EXCLUSIVE";.
5540: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52    }.  return "ER
5550: 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR";.}.#endif..
5560: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  #ifdef SQLITE_LO
5570: 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50  CK_TRACE./*.** P
5580: 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61  rint out informa
5590: 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c  tion about all l
55a0: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
55b0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
55c0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
55d0: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
55e0: 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69  g locks on multi
55f0: 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74  threaded.** plat
5600: 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62  forms.  Enable b
5610: 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  y compiling with
5620: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f   the -DSQLITE_LO
5630: 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d  CK_TRACE.** comm
5640: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
5650: 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  on the compiler.
5660: 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e    This code is n
5670: 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65  ormally.** turne
5680: 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  d off..*/.static
5690: 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69   int lockTrace(i
56a0: 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73  nt fd, int op, s
56b0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b  truct flock *p){
56c0: 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  .  char *zOpName
56d0: 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20  , *zType;.  int 
56e0: 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72  s;.  int savedEr
56f0: 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46  rno;.  if( op==F
5700: 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _GETLK ){.    zO
5710: 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b  pName = "GETLK";
5720: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
5730: 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_SETLK ){.    
5740: 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b  zOpName = "SETLK
5750: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
5760: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
5770: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
5780: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5790: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
57a0: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
57b0: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
57c0: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
57d0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
57e0: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
57f0: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
5800: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
5810: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
5820: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
5830: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
5840: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
5850: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
5860: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
5870: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
5880: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5890: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
58a0: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f  K_SET );.  s = o
58b0: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
58c0: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
58d0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
58e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
58f0: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
5900: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
5910: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
5920: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
5930: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
5940: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
5950: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
5960: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
5970: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
5980: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
5990: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
59a0: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
59b0: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
59c0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
59d0: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
59e0: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
59f0: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
5a00: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
5a10: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
5a20: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
5a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
5a40: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
5a50: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
5a60: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
5a70: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
5a80: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
5a90: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
5aa0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
5ab0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
5ac0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
5ad0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5ae0: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
5af0: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
5b00: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
5b10: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
5b20: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
5b30: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
5b40: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
5b50: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
5b60: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75    return s;.}.#u
5b70: 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65  ndef osFcntl.#de
5b80: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63  fine osFcntl loc
5b90: 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a  kTrace.#endif /*
5ba0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
5bb0: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CE */../*.** Ret
5bc0: 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63  ry ftruncate() c
5bd0: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
5be0: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a  ue to EINTR.**.*
5bf0: 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 66  * All calls to f
5c00: 74 72 75 6e 63 61 74 65 28 29 20 77 69 74 68 69  truncate() withi
5c10: 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68 6f 75  n this file shou
5c20: 6c 64 20 62 65 20 6d 61 64 65 20 74 68 72 6f 75  ld be made throu
5c30: 67 68 0a 2a 2a 20 74 68 69 73 20 77 72 61 70 70  gh.** this wrapp
5c40: 65 72 2e 20 20 4f 6e 20 74 68 65 20 41 6e 64 72  er.  On the Andr
5c50: 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62 79  oid platform, by
5c60: 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 69  passing the logi
5c70: 63 20 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64  c below.** could
5c80: 20 6c 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75   lead to a corru
5c90: 70 74 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  pt database..*/.
5ca0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
5cb0: 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20  t_ftruncate(int 
5cc0: 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  h, sqlite3_int64
5cd0: 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   sz){.  int rc;.
5ce0: 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44  #ifdef __ANDROID
5cf0: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f  __.  /* On Andro
5d00: 69 64 2c 20 66 74 72 75 6e 63 61 74 65 28 29 20  id, ftruncate() 
5d10: 61 6c 77 61 79 73 20 75 73 65 73 20 33 32 2d 62  always uses 32-b
5d20: 69 74 20 6f 66 66 73 65 74 73 2c 20 65 76 65 6e  it offsets, even
5d30: 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f   if .  ** _FILE_
5d40: 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69  OFFSET_BITS=64 i
5d50: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
5d60: 6d 65 61 6e 73 20 69 74 20 69 73 20 75 6e 73 61  means it is unsa
5d70: 66 65 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  fe to attempt to
5d80: 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 61  .  ** truncate a
5d90: 20 66 69 6c 65 20 74 6f 20 61 6e 79 20 73 69 7a   file to any siz
5da0: 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 32 47  e larger than 2G
5db0: 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e  iB. Silently ign
5dc0: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ore any.  ** suc
5dd0: 68 20 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f 0a  h attempts.  */.
5de0: 20 20 69 66 28 20 73 7a 3e 28 73 71 6c 69 74 65    if( sz>(sqlite
5df0: 33 5f 69 6e 74 36 34 29 30 78 37 46 46 46 46 46  3_int64)0x7FFFFF
5e00: 46 46 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  FF ){.    rc = S
5e10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
5e20: 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20 72  e.#endif.  do{ r
5e30: 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28  c = osFtruncate(
5e40: 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72  h,sz); }while( r
5e50: 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
5e60: 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
5e70: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
5e80: 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c  s routine transl
5e90: 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20  ates a standard 
5ea0: 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65  POSIX errno code
5eb0: 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a   into something.
5ec0: 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65  ** useful to the
5ed0: 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20   clients of the 
5ee0: 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e  sqlite3 function
5ef0: 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
5f00: 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e  , it is.** inten
5f10: 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65  ded to translate
5f20: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74   a variety of "t
5f30: 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73  ry again" errors
5f40: 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53   into SQLITE_BUS
5f50: 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65  Y.** and a varie
5f60: 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c  ty of "please cl
5f70: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
5f80: 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72  criptor NOW" err
5f90: 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c  ors into .** SQL
5fa0: 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a  ITE_IOERR.** .**
5fb0: 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69   Errors during i
5fc0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
5fd0: 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20   locks, or file 
5fe0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66  system support f
5ff0: 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f  or locks,.** sho
6000: 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43  uld handle ENOLC
6010: 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e  K, ENOTSUP, EOPN
6020: 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c  OTSUPP separatel
6030: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
6040: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
6050: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70  PosixError(int p
6060: 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73  osixError, int s
6070: 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20  qliteIOErr) {.  
6080: 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72  switch (posixErr
6090: 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a  or) {.#if 0.  /*
60a0: 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
60b0: 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f 74 20  is code was not 
60c0: 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49  commented out. I
60d0: 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73 20 62  n theory, this b
60e0: 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c  ranch.  ** shoul
60f0: 64 20 6e 65 76 65 72 20 62 65 20 68 69 74 2c 20  d never be hit, 
6100: 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  as this function
6110: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
6120: 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20 20 2a  called after.  *
6130: 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61  * a locking-rela
6140: 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e  ted function (i.
6150: 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61 73 20  e. fcntl()) has 
6160: 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72  returned non-zer
6170: 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  o with.  ** the 
6180: 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 61  value of errno a
6190: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
61a0: 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20 73 79  ment. Since a sy
61b0: 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20 66 61  stem call has fa
61c0: 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f  iled,.  ** errno
61d0: 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a   should be non-z
61e0: 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ero..  **.  ** D
61f0: 65 73 70 69 74 65 20 74 68 69 73 2c 20 69 66 20  espite this, if 
6200: 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20  errno really is 
6210: 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64  zero, we still d
6220: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 74  on't want to ret
6230: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
6240: 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d 20 63  OK. The system c
6250: 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64 20  all failed, and 
6260: 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65 72  *some* SQLite er
6270: 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  ror should be.  
6280: 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20 62 61  ** propagated ba
6290: 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ck to the caller
62a0: 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69  . Commenting thi
62b0: 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d 65 61  s branch out mea
62c0: 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a  ns errno==0.  **
62d0: 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64   will be handled
62e0: 20 62 79 20 74 68 65 20 22 64 65 66 61 75 6c 74   by the "default
62f0: 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20  :" case below.. 
6300: 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a 20   */.  case 0: . 
6310: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6320: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63  _OK;.#endif..  c
6330: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
6340: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
6350: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
6360: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
6370: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
6380: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
6390: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
63a0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
63b0: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
63c0: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
63d0: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
63e0: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
63f0: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
6400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6410: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
6420: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f  e EACCES: .    /
6430: 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65  * EACCES is like
6440: 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c   EAGAIN during l
6450: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
6460: 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  s, but not any o
6470: 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20  ther time*/.    
6480: 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  if( (sqliteIOErr
6490: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
64a0: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20  _LOCK) || .     
64b0: 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20     (sqliteIOErr 
64c0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
64d0: 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20  UNLOCK) || .    
64e0: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
64f0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6500: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20  _RDLOCK) ||.    
6510: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
6520: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6530: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
6540: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  CK) ){.      ret
6550: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
6560: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c  .    }.    /* el
6570: 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
6580: 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a  */.  case EPERM:
6590: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
65a0: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 23  ITE_PERM;.    .#
65b0: 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45  if EOPNOTSUPP!=E
65c0: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f  NOTSUP.  case EO
65d0: 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f  PNOTSUPP: .    /
65e0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74  * something went
65f0: 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20   terribly awry, 
6600: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
6610: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
6620: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
6630: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
6640: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
6650: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
6660: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
6670: 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  f ENOTSUP.  case
6680: 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f   ENOTSUP: .    /
6690: 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e  * invalid fd, un
66a0: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
66b0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
66c0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
66d0: 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20  n which .     * 
66e0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
66f0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6700: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  /.#endif.  case 
6710: 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44  EIO:.  case EBAD
6720: 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c  F:.  case EINVAL
6730: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e  :.  case ENOTCON
6740: 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56  N:.  case ENODEV
6750: 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a  :.  case ENXIO:.
6760: 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23    case ENOENT:.#
6770: 69 66 64 65 66 20 45 53 54 41 4c 45 20 20 20 20  ifdef ESTALE    
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6790: 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f   /* ESTALE is no
67a0: 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74  t defined on Int
67b0: 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a  erix systems */.
67c0: 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23    case ESTALE:.#
67d0: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f  endif.  case ENO
67e0: 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73  SYS:.    /* thes
67f0: 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74  e should force t
6800: 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f  he client to clo
6810: 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  se the file and 
6820: 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20  reconnect */.   
6830: 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20   .  default: .  
6840: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49    return sqliteI
6850: 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  OErr;.  }.}.../*
6860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68c0: 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69   Begin Unique Fi
68d0: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
68e0: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6900: 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73  .** On most vers
6910: 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65  ions of unix, we
6920: 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75   can get a uniqu
6930: 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20  e ID for a file 
6940: 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67  by concatenating
6950: 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e  .** the device n
6960: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e  umber and the in
6970: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74  ode number.  But
6980: 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77   this does not w
6990: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
69a0: 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61  ** On VxWorks, a
69b0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20   unique file id 
69c0: 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e  must be based on
69d0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
69e0: 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41  ilename..**.** A
69f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
6a00: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
6a10: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
6a20: 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  re can be used a
6a30: 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69  s a.** unique fi
6a40: 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73  le ID in VxWorks
6a50: 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  .  Each instance
6a60: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
6a70: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  re contains.** a
6a80: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e   copy of the can
6a90: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
6aa0: 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20    There is also 
6ab0: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
6ac0: 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75  t.  .** The stru
6ad0: 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d  cture is reclaim
6ae0: 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed when the numb
6af0: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
6b00: 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a  o it drops to.**
6b10: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   zero..**.** The
6b20: 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72  re are never ver
6b30: 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65  y many files ope
6b40: 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e  n at one time an
6b50: 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f  d lookups are no
6b60: 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e  t.** a performan
6b70: 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68  ce-critical path
6b80: 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69  , so it is suffi
6b90: 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65  cient to put the
6ba0: 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73  se.** structures
6bb0: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
6bc0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77  t..*/.struct vxw
6bd0: 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73  orksFileId {.  s
6be0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6bf0: 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20  eId *pNext;  /* 
6c00: 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f  Next in a list o
6c10: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20  f them all */.  
6c20: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6c40: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
6c50: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e  ences to this on
6c60: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
6c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6c80: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
6c90: 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c  f the zCanonical
6ca0: 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f  Name[] string */
6cb0: 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69  .  char *zCanoni
6cc0: 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  calName;        
6cd0: 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69   /* Canonical fi
6ce0: 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69  lename */.};..#i
6cf0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20  f OS_VXWORKS./* 
6d00: 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66  .** All unique f
6d10: 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c  ilenames are hel
6d20: 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  d on a linked li
6d30: 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69  st headed by thi
6d40: 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a  s.** variable:.*
6d50: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
6d60: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76  vxworksFileId *v
6d70: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
6d80: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c   0;../*.** Simpl
6d90: 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69  ify a filename i
6da0: 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61  nto its canonica
6db0: 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b  l form.** by mak
6dc0: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
6dd0: 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a  g changes:.**.**
6de0: 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79    * removing any
6df0: 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75   trailing and du
6e00: 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20  plicate /.**  * 
6e10: 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f  convert /./ into
6e20: 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f   just /.**  * co
6e30: 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65  nvert /A/../ whe
6e40: 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70  re A is any simp
6e50: 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73  le name into jus
6e60: 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  t /.**.** Change
6e70: 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c  s are made in-pl
6e80: 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ace.  Return the
6e90: 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68   new name length
6ea0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
6eb0: 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
6ec0: 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20   in z[0..n-1].  
6ed0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
6ee0: 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65  r of.** characte
6ef0: 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69  rs in the simpli
6f00: 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  fied name..*/.st
6f10: 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73  atic int vxworks
6f20: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61  SimplifyName(cha
6f30: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
6f40: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c  int i, j;.  whil
6f50: 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>1 && z[n-1]
6f60: 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  =='/' ){ n--; }.
6f70: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
6f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
6f90: 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[i]=='/' ){.   
6fa0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
6fb0: 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  /' ) continue;. 
6fc0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
6fd0: 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26  ='.' && i+2<n &&
6fe0: 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+2]=='/' ){.
6ff0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a          i += 1;.
7000: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7010: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7020: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20  if( z[i+1]=='.' 
7030: 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b  && i+3<n && z[i+
7040: 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33  2]=='.' && z[i+3
7050: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
7060: 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
7070: 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a  z[j-1]!='/' ){ j
7080: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  --; }.        if
7090: 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  ( j>0 ){ j--; }.
70a0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a          i += 2;.
70b0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
70c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
70d0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
70e0: 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  ];.  }.  z[j] = 
70f0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d  0;.  return j;.}
7100: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75  ../*.** Find a u
7110: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
7120: 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f  r the given abso
7130: 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20  lute pathname.  
7140: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
7150: 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72  ter to the vxwor
7160: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
7170: 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69    This pointer i
7180: 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20  s the unique.** 
7190: 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54  file ID..**.** T
71a0: 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66  he nRef field of
71b0: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
71c0: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63  Id object is inc
71d0: 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a  remented before.
71e0: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  ** the object is
71f0: 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65   returned.  A ne
7200: 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  w vxworksFileId 
7210: 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
7220: 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74  d.** and added t
7230: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  o the global lis
7240: 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  t if necessary..
7250: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
7260: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
7270: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
7280: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
7290: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
72a0: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
72b0: 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20  indFileId(const 
72c0: 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e  char *zAbsoluteN
72d0: 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76  ame){.  struct v
72e0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
72f0: 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ew;         /* s
7300: 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65  earch key and ne
7310: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73  w file ID */.  s
7320: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
7330: 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b  eId *pCandidate;
7340: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
7350: 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20  g over existing 
7360: 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e  file IDs */.  in
7370: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7390: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
73a0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72  AbsoluteName str
73b0: 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ing */..  assert
73c0: 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b  ( zAbsoluteName[
73d0: 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d  0]=='/' );.  n =
73e0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62   (int)strlen(zAb
73f0: 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70  soluteName);.  p
7400: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
7410: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
7420: 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20  ew) + (n+1) );. 
7430: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7440: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7450: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20  >zCanonicalName 
7460: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
7470: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  ];.  memcpy(pNew
7480: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
7490: 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c  , zAbsoluteName,
74a0: 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77   n+1);.  n = vxw
74b0: 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65  orksSimplifyName
74c0: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
74d0: 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a  lName, n);..  /*
74e0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
74f0: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68  xisting entry th
7500: 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20  at matching the 
7510: 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a  canonical name..
7520: 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69    ** If found, i
7530: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
7540: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64  erence count and
7550: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
7560: 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78  r to.  ** the ex
7570: 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a  isting file ID..
7580: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
7590: 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70  Mutex();.  for(p
75a0: 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b  Candidate=vxwork
75b0: 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64  sFileList; pCand
75c0: 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74  idate; pCandidat
75d0: 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e  e=pCandidate->pN
75e0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
75f0: 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d  andidate->nName=
7600: 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63  =n .     && memc
7610: 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a  mp(pCandidate->z
7620: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70  CanonicalName, p
7630: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
7640: 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29  ame, n)==0.    )
7650: 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  {.       sqlite3
7660: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
7670: 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e      pCandidate->
7680: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75  nRef++;.       u
7690: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
76a0: 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  .       return p
76b0: 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d  Candidate;.    }
76c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61  .  }..  /* No ma
76d0: 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  tch was found.  
76e0: 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e  We will make a n
76f0: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
7700: 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pNew->nRef = 1;.
7710: 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20    pNew->nName = 
7720: 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  n;.  pNew->pNext
7730: 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69   = vxworksFileLi
7740: 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c  st;.  vxworksFil
7750: 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  eList = pNew;.  
7760: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7770: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
7790: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
77a0: 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77  e count on a vxw
77b0: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
77c0: 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20  t.  Free.** the 
77d0: 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20  object when the 
77e0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
77f0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f  reaches zero..*/
7800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77  .static void vxw
7810: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
7820: 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  d(struct vxworks
7830: 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20  FileId *pId){.  
7840: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
7850: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d  ;.  assert( pId-
7860: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64  >nRef>0 );.  pId
7870: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
7880: 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pId->nRef==0 ){.
7890: 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72      struct vxwor
78a0: 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20  ksFileId **pp;. 
78b0: 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72     for(pp=&vxwor
78c0: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20  ksFileList; *pp 
78d0: 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20  && *pp!=pId; pp 
78e0: 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  = &((*pp)->pNext
78f0: 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28  )){}.    assert(
7900: 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20   *pp==pId );.   
7910: 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78   *pp = pId->pNex
7920: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  t;.    sqlite3_f
7930: 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20  ree(pId);.  }.  
7940: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7950: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  ;.}.#endif /* OS
7960: 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a  _VXWORKS */./***
7970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
7980: 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20   of Unique File 
7990: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
79a0: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
79b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
79c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 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 2a 2a 0a 2a 2a  *************.**
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 20 50 6f 73 69 78 20  ********* Posix 
7a80: 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
7a90: 20 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 0a 2a 2a  *************.**
7ab0: 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f  .** POSIX adviso
7ac0: 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f  ry locks are bro
7ad0: 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20  ken by design.  
7ae0: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
7af0: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
7b00: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
7b10: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
7b20: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
7b30: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
7b40: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
7b50: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
7b60: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
7b70: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
7b80: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
7b90: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
7ba0: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
7bb0: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
7bc0: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
7bd0: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
7be0: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
7bf0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
7c00: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
7c10: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
7c20: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
7c30: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
7c40: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  *.**       int f
7c50: 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d1 = open("./fil
7c60: 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e1", O_RDWR|O_CR
7c70: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20  EAT, 0644);.**  
7c80: 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f       int fd2 = o
7c90: 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f  pen("./file2", O
7ca0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
7cb0: 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70  644);.**.** Supp
7cc0: 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20  ose ./file1 and 
7cd0: 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c  ./file2 are real
7ce0: 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ly the same file
7cf0: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65   (because.** one
7d00: 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79   is a hard or sy
7d10: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74  mbolic link to t
7d20: 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69  he other) then i
7d30: 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20  f you set.** an 
7d40: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
7d50: 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20  n fd1, then try 
7d60: 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73  to get an exclus
7d70: 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66  ive lock.** on f
7d80: 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49  d2, it works.  I
7d90: 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65   would have expe
7da0: 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20  cted the second 
7db0: 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20  lock to.** fail 
7dc0: 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20  since there was 
7dd0: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
7de0: 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74  n the file due t
7df0: 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f  o fd1..** But no
7e00: 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74  t so.  Since bot
7e10: 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f  h locks came fro
7e20: 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  m the same proce
7e30: 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  ss, the.** secon
7e40: 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20  d overrides the 
7e50: 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75  first, even thou
7e60: 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20  gh they were on 
7e70: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
7e80: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
7e90: 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e  ened on differen
7ea0: 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a  t file names..**
7eb0: 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74  .** This means t
7ec0: 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hat we cannot us
7ed0: 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f  e POSIX locks to
7ee0: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c   synchronize fil
7ef0: 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e  e access.** amon
7f00: 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65  g competing thre
7f10: 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ads of the same 
7f20: 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20  process.  POSIX 
7f30: 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20  locks will work 
7f40: 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68  fine.** to synch
7f50: 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f  ronize access fo
7f60: 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70  r threads in sep
7f70: 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c  arate processes,
7f80: 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65   but not.** thre
7f90: 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  ads within the s
7fa0: 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ame process..**.
7fb0: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
7fc0: 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53  d the problem, S
7fd0: 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e  QLite has to man
7fe0: 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69  age file locks i
7ff0: 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20  nternally.** on 
8000: 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76  its own.  Whenev
8010: 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  er a new databas
8020: 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20  e is opened, we 
8030: 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65  have to find the
8040: 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f  .** specific ino
8050: 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
8060: 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f  se file (the ino
8070: 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  de is determined
8080: 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65   by the.** st_de
8090: 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65  v and st_ino fie
80a0: 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20  lds of the stat 
80b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66  structure that f
80c0: 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29  stat() fills in)
80d0: 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f  .** and check fo
80e0: 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20  r locks already 
80f0: 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74  existing on that
8100: 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f   inode.  When lo
8110: 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74  cks are.** creat
8120: 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77  ed or removed, w
8130: 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61  e have to look a
8140: 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e  t our own intern
8150: 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
8160: 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65  .** locks to see
8170: 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65   if another thre
8180: 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c  ad has previousl
8190: 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20  y set a lock on 
81a0: 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f  that same.** ino
81b0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65  de..**.** (Aside
81c0: 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f  : The use of ino
81d0: 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e  de numbers as un
81e0: 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f  ique IDs does no
81f0: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
8200: 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b  s..** For VxWork
8210: 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73  s, we have to us
8220: 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76  e the alternativ
8230: 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74  e unique ID syst
8240: 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63  em based on.** c
8250: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
8260: 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65  e and implemente
8270: 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  d in the previou
8280: 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a  s division.).**.
8290: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66  ** The sqlite3_f
82a0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ile structure fo
82b0: 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f  r POSIX is no lo
82c0: 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74  nger just an int
82d0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
82e0: 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20  criptor.  It is 
82f0: 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20  now a structure 
8300: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69  that holds the i
8310: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
8320: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20  escriptor and a 
8330: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
8340: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
8350: 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e  ribes the intern
8360: 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  al.** locks on t
8370: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
8380: 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69   inode.  There i
8390: 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74  s one locking st
83a0: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69  ructure.** per i
83b0: 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20  node, so if the 
83c0: 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70  same inode is op
83d0: 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68  ened twice, both
83e0: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
83f0: 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  ures.** point to
8400: 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e   the same lockin
8410: 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  g structure.  Th
8420: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
8430: 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72  ure keeps.** a r
8440: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28  eference count (
8450: 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  so we will know 
8460: 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69  when to delete i
8470: 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a  t) and a "cnt".*
8480: 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c  * field that tel
8490: 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e  ls us its intern
84a0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20  al lock status. 
84b0: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
84c0: 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c  e.** file is unl
84d0: 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20  ocked.  cnt==-1 
84e0: 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68  means the file h
84f0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
8500: 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d  lock..** cnt>0 m
8510: 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63  eans there are c
8520: 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  nt shared locks 
8530: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  on the file..**.
8540: 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  ** Any attempt t
8550: 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
8560: 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68   a file first ch
8570: 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ecks the locking
8580: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
8590: 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  The fcntl() syst
85a0: 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20  em call is only 
85b0: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61  invoked to set a
85c0: 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20   .** POSIX lock 
85d0: 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  if the internal 
85e0: 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74  lock structure t
85f0: 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65  ransitions betwe
8600: 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61  en.** a locked a
8610: 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73  nd an unlocked s
8620: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20  tate..**.** But 
8630: 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65  wait:  there are
8640: 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65   yet more proble
8650: 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64  ms with POSIX ad
8660: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a  visory locks..**
8670: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
8680: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
8690: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
86a0: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
86b0: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
86c0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
86d0: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
86e0: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
86f0: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
8700: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
8710: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
8720: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69  roblem, each uni
8730: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8740: 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61  t.** maintains a
8750: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
8760: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
8770: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f  locks on tha ino
8780: 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61  de..** When an a
8790: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
87a0: 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46  o close an unixF
87b0: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
87c0: 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46  e.** other unixF
87d0: 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ile open on the 
87e0: 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20  same inode that 
87f0: 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b  are holding lock
8800: 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74  s, the call.** t
8810: 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69  o close() the fi
8820: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
8830: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
8840: 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73  all of the locks
8850: 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75   clear..** The u
8860: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
8870: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
8880: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
8890: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
88a0: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
88b0: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
88c0: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
88d0: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
88e0: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
88f0: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20  ears..**.** Yet 
8900: 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a  another problem:
8910: 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64    LinuxThreads d
8920: 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20  o not play well 
8930: 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73  with posix locks
8940: 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64  ..**.** Many old
8950: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c  er versions of l
8960: 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e  inux use the Lin
8970: 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72  uxThreads librar
8980: 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f  y which is.** no
8990: 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e  t posix complian
89a0: 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54  t.  Under LinuxT
89b0: 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63  hreads, a lock c
89c0: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
89d0: 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20  .** A cannot be 
89e0: 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72  modified or over
89f0: 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66  ridden by a diff
8a00: 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a  erent thread B..
8a10: 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41  ** Only thread A
8a20: 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20   can modify the 
8a30: 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62  lock.  Locking b
8a40: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
8a50: 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70  ct.** if the app
8a60: 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  liation uses the
8a70: 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f   newer Native Po
8a80: 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61  six Thread Libra
8a90: 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20  ry (NPTL).** on 
8aa0: 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54  linux - with NPT
8ab0: 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  L a lock created
8ac0: 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e   by thread A can
8ad0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a   override locks.
8ae0: 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20  ** in thread B. 
8af0: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f   But there is no
8b00: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20   way to know at 
8b10: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69  compile-time whi
8b20: 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20  ch.** threading 
8b30: 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67  library is being
8b40: 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65   used.  So there
8b50: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
8b60: 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65  ow at.** compile
8b70: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
8b80: 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61   not thread A ca
8b90: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8ba0: 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a   on thread B..**
8bb0: 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61   One has to do a
8bc0: 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20   run-time check 
8bd0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
8be0: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a  behavior of the.
8bf0: 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  ** current proce
8c00: 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ss..**.** SQLite
8c10: 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74   used to support
8c20: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20   LinuxThreads.  
8c30: 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20  But support for 
8c40: 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20  LinuxThreads.** 
8c50: 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69  was dropped begi
8c60: 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69  nning with versi
8c70: 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74  on 3.7.0.  SQLit
8c80: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72  e will still wor
8c90: 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54  k with.** LinuxT
8ca0: 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20  hreads provided 
8cb0: 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69  that (1) there i
8cc0: 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
8cd0: 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  ne connection .*
8ce0: 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66  * per database f
8cf0: 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ile in the same 
8d00: 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20  process and (2) 
8d10: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8d20: 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d  ions.** do not m
8d30: 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61  ove across threa
8d40: 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ds..*/../*.** An
8d50: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
8d60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
8d70: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
8d80: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
8d90: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
8da0: 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49  cular unixInodeI
8db0: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
8dc0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
8dd0: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8df0: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
8e00: 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  r */.#if OS_VXWO
8e10: 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77  RKS.  struct vxw
8e20: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b  orksFileId *pId;
8e30: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
8e40: 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e   ID for vxworks.
8e50: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f   */.#else.  ino_
8e60: 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  t ino;          
8e70: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65          /* Inode
8e80: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69   number */.#endi
8e90: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
8ea0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
8eb0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
8ec0: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
8ed0: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
8ee0: 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20   inode.  Or, on 
8ef0: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68  LinuxThreads, th
8f00: 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ere is one of th
8f10: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ese structures f
8f20: 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65  or.** each inode
8f30: 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20   opened by each 
8f40: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
8f50: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
8f60: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
8f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
8f80: 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c   so each unixFil
8f90: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63  e.** structure c
8fa0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8fb0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
8fc0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
8fd0: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65  and this.** obje
8fe0: 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74  ct keeps a count
8ff0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
9000: 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74  f unixFile point
9010: 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ing to it..*/.st
9020: 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ruct unixInodeIn
9030: 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  fo {.  struct un
9040: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
9050: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
9060: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
9070: 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20  t nShared;      
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9090: 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45   Number of SHARE
90a0: 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  D locks held */.
90b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
90c0: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
90d0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52    /* One of SHAR
90e0: 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
90f0: 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20  D_LOCK etc. */. 
9100: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62   unsigned char b
9110: 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20  ProcessLock;    
9120: 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65   /* An exclusive
9130: 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73   process lock is
9140: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   held */.  int n
9150: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
9160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9170: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
9180: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
9190: 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  re */.  unixShmN
91a0: 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
91b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
91c0: 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
91d0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e  ted with this in
91e0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ode */.  int nLo
91f0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
9200: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9210: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
9220: 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a  g file locks */.
9230: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
9240: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
9250: 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65    /* Unused file
9260: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20   descriptors to 
9270: 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49  close */.  unixI
9280: 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b  nodeInfo *pNext;
9290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
92a0: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  st of all unixIn
92b0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
92c0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
92d0: 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  fo *pPrev;      
92e0: 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20       /*    .... 
92f0: 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f  doubly linked */
9300: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
9310: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
9320: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
9330: 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65   long sharedByte
9340: 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69  ;  /* for AFP si
9350: 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c  mulated shared l
9360: 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ock */.#endif.#i
9370: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
9380: 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20  em_t *pSem;     
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
93a0: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
93b0: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
93c0: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
93d0: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20  ATHNAME+2];  /* 
93e0: 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d  Name of that sem
93f0: 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66  aphore */.#endif
9400: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  .};../*.** A lis
9410: 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  ts of all unixIn
9420: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e  odeInfo objects.
9430: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49  .*/.static unixI
9440: 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c  nodeInfo *inodeL
9450: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a  ist = 0;../*.**.
9460: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9470: 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f   - unixLogError_
9480: 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65  x(), is only eve
9490: 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  r called via the
94a0: 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f   macro.** unixLo
94b0: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
94c0: 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  It is invoked af
94d0: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
94e0: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
94f0: 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20  ction and errno 
9500: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e  has been.** set.
9510: 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61   It logs a messa
9520: 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
9530: 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e  _log() containin
9540: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  g the current va
9550: 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20  lue of.** errno 
9560: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
9570: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
9580: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
9590: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
95a0: 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  or.** strerror_r
95b0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
95c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
95d0: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
95e0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
95f0: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
9600: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
9610: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
9620: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
9630: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
9640: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
9650: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
9660: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
9670: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
9680: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
9690: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
96a0: 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20  (e.g. "unlink", 
96b0: 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20  "open") and the 
96c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
96d0: 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20  system path,.** 
96e0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69  if any..*/.#defi
96f0: 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ne unixLogError(
9700: 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c  a,b,c)     unixL
9710: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
9720: 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74  b,c,__LINE__).st
9730: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67  atic int unixLog
9740: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
9750: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9770: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
9780: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
9790: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
97a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
97b0: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
97c0: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
97d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
97e0: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
97f0: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
9800: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
9810: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
9820: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
9830: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
9840: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
9850: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
9860: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
9870: 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20   *zErr;         
9880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9890: 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65  essage from stre
98a0: 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61  rror() or equiva
98b0: 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45  lent */.  int iE
98c0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20  rrno = errno;   
98d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76            /* Sav
98e0: 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72  ed syscall error
98f0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a   number */..  /*
9900: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
9910: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
9920: 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ld (SQLITE_THREA
9930: 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20  DSAFE==0), then 
9940: 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72  use.  ** the str
9950: 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e  error() function
9960: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68   to obtain the h
9970: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72  uman-readable er
9980: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
9990: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65   equivalent to e
99a0: 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c  rrno. Otherwise,
99b0: 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28   use strerror_r(
99c0: 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c  )..  */ .#if SQL
99d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
99e0: 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53  & defined(HAVE_S
99f0: 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61  TRERROR_R).  cha
9a00: 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65  r aErr[80];.  me
9a10: 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69  mset(aErr, 0, si
9a20: 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a  zeof(aErr));.  z
9a30: 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f  Err = aErr;..  /
9a40: 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f  * If STRERROR_R_
9a50: 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 61  CHAR_P (set by a
9a60: 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29  utoconf scripts)
9a70: 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73   or __USE_GNU is
9a80: 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61   defined,.  ** a
9a90: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
9aa0: 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74  ystem provides t
9ab0: 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f  he GNU version o
9ac0: 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74  f strerror_r() t
9ad0: 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  hat.  ** returns
9ae0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
9af0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
9b00: 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  g the error mess
9b10: 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65  age. That pointe
9b20: 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e  r .  ** may poin
9b30: 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20  t to aErr[], or 
9b40: 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  it may point to 
9b50: 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72  some static stor
9b60: 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a  age somewhere. .
9b70: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
9b80: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
9b90: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
9ba0: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
9bb0: 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72  n of .  ** strer
9bc0: 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61  ror_r(), which a
9bd0: 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e 20  lways writes an 
9be0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
9bf0: 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a  to aErr[]..  **.
9c00: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65    ** If the code
9c10: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73   incorrectly ass
9c20: 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
9c30: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
9c40: 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61  n that is.  ** a
9c50: 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72  vailable, the er
9c60: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
9c70: 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70   often be an emp
9c80: 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61  ty string. Not a
9c90: 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c  .  ** huge probl
9ca0: 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20  em. Incorrectly 
9cb0: 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20  concluding that 
9cc0: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
9cd0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20  is available .  
9ce0: 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  ** could lead to
9cf0: 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75   a segfault thou
9d00: 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  gh..  */.#if def
9d10: 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f  ined(STRERROR_R_
9d20: 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e  CHAR_P) || defin
9d30: 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20  ed(__USE_GNU).  
9d40: 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a  zErr = .# endif.
9d50: 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72    strerror_r(iEr
9d60: 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f  rno, aErr, sizeo
9d70: 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c  f(aErr)-1);..#el
9d80: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
9d90: 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69  SAFE.  /* This i
9da0: 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62  s a threadsafe b
9db0: 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72  uild, but strerr
9dc0: 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76  or_r() is not av
9dd0: 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45  ailable. */.  zE
9de0: 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20  rr = "";.#else. 
9df0: 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61   /* Non-threadsa
9e00: 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74  fe build, use st
9e10: 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a  rerror(). */.  z
9e20: 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69  Err = strerror(i
9e30: 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  Errno);.#endif..
9e40: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
9e50: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73   zPath = "";.  s
9e60: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
9e70: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e  de,.      "os_un
9e80: 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73  ix.c:%d: (%d) %s
9e90: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
9ea0: 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c    iLine, iErrno,
9eb0: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
9ec0: 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Err.  );..  retu
9ed0: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
9ee0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
9ef0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
9f00: 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68  .** We assume th
9f10: 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73  at close() almos
9f20: 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20  t always works, 
9f30: 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79  since it is only
9f40: 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69   in a.** very si
9f50: 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f  ck application o
9f60: 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b  r on a very sick
9f70: 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69   platform that i
9f80: 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a  t might fail..**
9f90: 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c   If it does fail
9fa0: 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68  , simply leak th
9fb0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9fc0: 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68  r, but do log th
9fd0: 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  e.** error..**.*
9fe0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  * Note that it i
9ff0: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65  s not safe to re
a000: 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65  try close() afte
a010: 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68  r EINTR since th
a020: 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  e.** file descri
a030: 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20  ptor might have 
a040: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 75  already been reu
a050: 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74  sed by another t
a060: 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20  hread..** So we 
a070: 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74  don't even try t
a080: 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
a090: 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c  n EINTR.  Just l
a0a0: 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  og the error.** 
a0b0: 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a  and move on..*/.
a0c0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75  static void robu
a0d0: 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c  st_close(unixFil
a0e0: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c  e *pFile, int h,
a0f0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20   int lineno){.  
a100: 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29  if( osClose(h) )
a110: 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  {.    unixLogErr
a120: 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f  orAtLine(SQLITE_
a130: 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c  IOERR_CLOSE, "cl
a140: 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ose",.          
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
a160: 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le ? pFile->zPat
a170: 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  h : 0, lineno);.
a180: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
a190: 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73 74   the pFile->last
a1a0: 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73 20  Errno.  Do this 
a1b0: 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  in a subroutine 
a1c0: 61 73 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  as that provides
a1d0: 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  .** a convenient
a1e0: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
a1f0: 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  breakpoint..*/.s
a200: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
a210: 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69 78 46 69  LastErrno(unixFi
a220: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
a230: 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d 3e  rror){.  pFile->
a240: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f  lastErrno = erro
a250: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  r;.}../*.** Clos
a260: 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  e all file descr
a270: 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65  iptors accumuate
a280: 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  d in the unixIno
a290: 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20  deInfo->pUnused 
a2a0: 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  list..*/ .static
a2b0: 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69   void closePendi
a2c0: 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a  ngFds(unixFile *
a2d0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
a2e0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
a2f0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
a300: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
a310: 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  *p;.  UnixUnused
a320: 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  Fd *pNext;.  for
a330: 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  (p=pInode->pUnus
a340: 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ed; p; p=pNext){
a350: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
a360: 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73  pNext;.    robus
a370: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
a380: 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  ->fd, __LINE__);
a390: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a3a0: 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f  e(p);.  }.  pIno
a3b0: 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  de->pUnused = 0;
a3c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
a3d0: 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  e a unixInodeInf
a3e0: 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  o structure prev
a3f0: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
a400: 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   by findInodeInf
a410: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  o()..**.** The m
a420: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
a430: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
a440: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
a450: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
a460: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
a470: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
a480: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
a490: 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75  leaseInodeInfo(u
a4a0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
a4b0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a4c0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
a4d0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
a4e0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
a4f0: 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  d() );.  if( ALW
a500: 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20  AYS(pInode) ){. 
a510: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d     pInode->nRef-
a520: 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
a530: 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
a540: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
a550: 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  de->pShmNode==0 
a560: 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65  );.      closePe
a570: 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
a580: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
a590: 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  e->pPrev ){.    
a5a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
a5b0: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
a5c0: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
a5d0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
a5e0: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  v->pNext = pInod
a5f0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
a610: 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74  ssert( inodeList
a620: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
a630: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
a640: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
a650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a660: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29   pInode->pNext )
a670: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a680: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d  ( pInode->pNext-
a690: 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29  >pPrev==pInode )
a6a0: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
a6b0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
a6c0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a   pInode->pPrev;.
a6d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a6e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64  lite3_free(pInod
a6f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
a700: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
a710: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
a720: 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49  locate the unixI
a730: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
a740: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
a750: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
a760: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
a770: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
a780: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
a790: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67  return value mig
a7a0: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
a7b0: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
a7c0: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
a7d0: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
a7e0: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
a7f0: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
a800: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
a810: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
a820: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a830: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
a840: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
a850: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
a860: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64  tic int findInod
a870: 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  eInfo(.  unixFil
a880: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
a890: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
a8a0: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
a8b0: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
a8c0: 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  key */.  unixIno
a8d0: 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65  deInfo **ppInode
a8e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
a8f0: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
a900: 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20  nfo object here 
a910: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
a940: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
a950: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
a980: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
a990: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
a9a0: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
a9b0: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
a9c0: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
a9d0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a9e0: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
a9f0: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
aa00: 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
aa10: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
aa20: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
aa30: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b  nfo *pInode = 0;
aa40: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
aa50: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
aa60: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
aa70: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
aa80: 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65  ld() );..  /* Ge
aa90: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
aaa0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
aab0: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
aac0: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
aad0: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
aae0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
aaf0: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
ab00: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
ab10: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
ab20: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
ab30: 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  =0 ){.    storeL
ab40: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
ab50: 65 72 72 6e 6f 29 3b 0a 23 69 66 64 65 66 20 45  errno);.#ifdef E
ab60: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
ab70: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ab80: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
ab90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
aba0: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
abb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
abc0: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
abd0: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
abe0: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
abf0: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
ac00: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
ac10: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
ac20: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
ac30: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
ac40: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
ac50: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
ac60: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
ac70: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
ac80: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
ac90: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
aca0: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
acb0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
acc0: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
acd0: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
ace0: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
acf0: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
ad00: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
ad10: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
ad20: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
ad30: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
ad40: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
ad50: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
ad60: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
ad70: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
ad80: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
ad90: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
ada0: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
adb0: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
adc0: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
add0: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
ade0: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
adf0: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
ae00: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
ae10: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
ae20: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
ae30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
ae40: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
ae50: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
ae60: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
ae70: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
ae80: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
ae90: 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c  osWrite(fd, "S",
aea0: 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c   1); }while( rc<
aeb0: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
aec0: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  R );.    if( rc!
aed0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =1 ){.      stor
aee0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
aef0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
af00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
af10: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ERR;.    }.    r
af20: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
af30: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
af40: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
af50: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
af60: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
af70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
af80: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
af90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
afa0: 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30  emset(&fileId, 0
afb0: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
afc0: 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20  );.  fileId.dev 
afd0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
afe0: 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
aff0: 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20  .  fileId.pId = 
b000: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
b010: 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d  e.  fileId.ino =
b020: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
b030: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65  .#endif.  pInode
b040: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
b050: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
b060: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
b070: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
b080: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
b090: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
b0a0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
b0b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
b0c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
b0d0: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
b0e0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e  loc( sizeof(*pIn
b0f0: 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ode) );.    if( 
b100: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
b110: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b120: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
b130: 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c    memset(pInode,
b140: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f   0, sizeof(*pIno
b150: 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  de));.    memcpy
b160: 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  (&pInode->fileId
b170: 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  , &fileId, sizeo
b180: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20  f(fileId));.    
b190: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31  pInode->nRef = 1
b1a0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e  ;.    pInode->pN
b1b0: 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ext = inodeList;
b1c0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72  .    pInode->pPr
b1d0: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
b1e0: 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64  inodeList ) inod
b1f0: 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  eList->pPrev = p
b200: 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65  Inode;.    inode
b210: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  List = pInode;. 
b220: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f   }else{.    pIno
b230: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  de->nRef++;.  }.
b240: 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e    *ppInode = pIn
b250: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
b260: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b270: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b280: 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20   pFile has been 
b290: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
b2a0: 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73  ked since it was
b2b0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a   first opened..*
b2c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
b2d0: 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69  eHasMoved(unixFi
b2e0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20  le *pFile){.#if 
b2f0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74  OS_VXWORKS.  ret
b300: 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  urn pFile->pInod
b310: 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70  e!=0 && pFile->p
b320: 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  Id!=pFile->pInod
b330: 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23  e->fileId.pId;.#
b340: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
b350: 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e  at buf;.  return
b360: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d   pFile->pInode!=
b370: 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74  0 &&.      (osSt
b380: 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  at(pFile->zPath,
b390: 20 26 62 75 66 29 21 3d 30 20 7c 7c 20 62 75 66   &buf)!=0 || buf
b3a0: 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e  .st_ino!=pFile->
b3b0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
b3c0: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  no);.#endif.}...
b3d0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e  /*.** Check a un
b3e0: 69 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61  ixFile that is a
b3f0: 20 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69   database.  Veri
b400: 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  fy the following
b410: 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72  :.**.** (1) Ther
b420: 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
b430: 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68   hard link on th
b440: 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68  e file.** (2) Th
b450: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  e file is not a 
b460: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a  symbolic link.**
b470: 20 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61   (3) The file ha
b480: 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d  s not been renam
b490: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a  ed or unlinked.*
b4a0: 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74  *.** Issue sqlit
b4b0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b4c0: 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61  RNING,...) messa
b4d0: 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ges if anything 
b4e0: 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f  is not right..*/
b4f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72  .static void ver
b500: 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69  ifyDbFile(unixFi
b510: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74  le *pFile){.  st
b520: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
b530: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
b540: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b550: 26 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  & UNIXFILE_WARNE
b560: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  D ){.    /* One 
b570: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 66  or more of the f
b580: 6f 6c 6c 6f 77 69 6e 67 20 77 61 72 6e 69 6e 67  ollowing warning
b590: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b5a0: 65 65 6e 20 69 73 73 75 65 64 2e 20 20 44 6f 20  een issued.  Do 
b5b0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 72 65 70 65 61  not.    ** repea
b5c0: 74 20 74 68 65 6d 20 73 6f 20 61 73 20 6e 6f 74  t them so as not
b5d0: 20 74 6f 20 63 6c 75 74 74 65 72 20 74 68 65 20   to clutter the 
b5e0: 65 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 20  error log */.   
b5f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
b600: 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c  c = osFstat(pFil
b610: 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69  e->h, &buf);.  i
b620: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
b630: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b640: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e  TE_WARNING, "can
b650: 6e 6f 74 20 66 73 74 61 74 20 64 62 20 66 69 6c  not fstat db fil
b660: 65 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  e %s", pFile->zP
b670: 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ath);.    pFile-
b680: 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
b690: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20  IXFILE_WARNED;. 
b6a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b6b0: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
b6c0: 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  k==0 && (pFile->
b6d0: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
b6e0: 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  FILE_DELETE)==0 
b6f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b700: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b710: 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65  G, "file unlinke
b720: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b730: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b740: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  ;.    pFile->ctr
b750: 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
b760: 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72  LE_WARNED;.    r
b770: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
b780: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20   buf.st_nlink>1 
b790: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b7a0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b7b0: 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e  G, "multiple lin
b7c0: 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c  ks to file: %s",
b7d0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
b7e0: 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
b7f0: 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
b800: 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74  _WARNED;.    ret
b810: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  urn;.  }.  if( f
b820: 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c  ileHasMoved(pFil
b830: 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
b840: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
b850: 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61  NING, "file rena
b860: 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20  med while open: 
b870: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
b880: 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  h);.    pFile->c
b890: 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
b8a0: 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20  FILE_WARNED;.   
b8b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
b8c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b8d0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
b8e0: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
b8f0: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
b900: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
b910: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
b920: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
b930: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
b940: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
b950: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
b960: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
b970: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
b980: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
b990: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
b9a0: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
b9b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
b9c0: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
b9d0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
b9e0: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
b9f0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
ba00: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
ba10: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
ba20: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
ba30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ba40: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
ba50: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
ba60: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
ba70: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
ba80: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
ba90: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
baa0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
bab0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
bac0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
bad0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
bae0: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
baf0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
bb00: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
bb10: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
bb20: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
bb30: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
bb40: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
bb50: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
bb60: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
bb70: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
bb80: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
bb90: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
bba0: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
bbb0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
bbc0: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
bbd0: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
bbe0: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
bbf0: 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e  rved && !pFile->
bc00: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
bc10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75  Lock ){.    stru
bc20: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
bc30: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
bc40: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
bc50: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bc60: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
bc70: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
bc80: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
bc90: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
bca0: 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46    if( osFcntl(pF
bcb0: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
bcc0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
bcd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
bce0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
bcf0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
bd00: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
bd10: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20  , errno);.    } 
bd20: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
bd30: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
bd40: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
bd50: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 1;.    }.  }.#
bd60: 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c  endif.  .  unixL
bd70: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
bd80: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
bd90: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
bda0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
bdb0: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
bdc0: 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
bdd0: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
bde0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bdf0: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
be00: 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f   a system-lock o
be10: 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65  n the file pFile
be20: 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a  .  The lock is .
be30: 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ** described by 
be40: 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pLock..**.** If 
be50: 74 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70  the pFile was op
be60: 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20  ened read/write 
be70: 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20  from unix-excl, 
be80: 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f  then the only lo
be90: 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69  ck.** ever obtai
bea0: 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73  ned is an exclus
beb0: 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74  ive lock, and it
bec0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61   is obtained exa
bed0: 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ctly once.** the
bee0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
bef0: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
bf00: 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65  d.  All subseque
bf10: 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e  nt system lockin
bf20: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  g.** operations 
bf30: 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20  become no-ops.  
bf40: 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  Locking operatio
bf50: 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20  ns still happen 
bf60: 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69  internally,.** i
bf70: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64  n order to coord
bf80: 69 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74  inate access bet
bf90: 77 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61  ween separate da
bfa0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bfb0: 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ns.** within thi
bfc0: 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61  s process, but a
bfd0: 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61  ll of that is ha
bfe0: 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  ndled in memory 
bff0: 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  and the.** opera
c000: 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73  ting system does
c010: 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65   not participate
c020: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
c030: 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d  ction is a pass-
c040: 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c  through to fcntl
c050: 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69  (F_SETLK) if pFi
c060: 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61  le is using.** a
c070: 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61  ny VFS other tha
c080: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72  n "unix-excl" or
c090: 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65   if pFile is ope
c0a0: 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63  ned on "unix-exc
c0b0: 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61  l".** and is rea
c0c0: 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65  d-only..**.** Ze
c0d0: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
c0e0: 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c  f the call compl
c0f0: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
c100: 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61  y, or -1 if a ca
c110: 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29  ll.** to fcntl()
c120: 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20   fails. In this 
c130: 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73  case, errno is s
c140: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
c150: 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a   (by fcntl())..*
c160: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
c170: 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69  xFileLock(unixFi
c180: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63  le *pFile, struc
c190: 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b  t flock *pLock){
c1a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
c1b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
c1c0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
c1d0: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
c1e0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
c1f0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
c200: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  e!=0 );.  if( ((
c210: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
c220: 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c   & UNIXFILE_EXCL
c230: 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  )!=0 || pInode->
c240: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20  bProcessLock).  
c250: 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72   && ((pFile->ctr
c260: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
c270: 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20  E_RDONLY)==0).  
c280: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  ){.    if( pInod
c290: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
c2a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
c2b0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
c2c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
c2d0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b  ode->nLock==0 );
c2e0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
c2f0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
c300: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
c310: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
c320: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
c330: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
c340: 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ZE;.      lock.l
c350: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
c360: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63  .      rc = osFc
c370: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
c380: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
c390: 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20       if( rc<0 ) 
c3a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
c3b0: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
c3c0: 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  sLock = 1;.     
c3d0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
c3e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c3f0: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
c400: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
c410: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
c420: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c  ->h, F_SETLK, pL
c430: 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ock);.  }.  retu
c440: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c450: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
c460: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
c470: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
c480: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
c490: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
c4a0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
c4b0: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
c4c0: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
c4d0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
c4e0: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
c4f0: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
c500: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
c510: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
c520: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
c530: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
c540: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
c550: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
c560: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
c570: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
c580: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
c590: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
c5a0: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
c5b0: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
c5c0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
c5d0: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
c5e0: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
c5f0: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
c600: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
c610: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
c620: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
c630: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
c640: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
c650: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
c660: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
c670: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
c680: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
c690: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
c6a0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
c6b0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
c6c0: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
c6d0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
c6e0: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
c6f0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
c700: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c710: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
c720: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
c730: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
c740: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
c750: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
c760: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
c770: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
c780: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
c790: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
c7a0: 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  k){.  /* The fol
c7b0: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
c7c0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
c7d0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
c7e0: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
c7f0: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
c800: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
c810: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
c820: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
c830: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
c840: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
c850: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
c860: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
c870: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
c880: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
c890: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
c8a0: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
c8b0: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
c8c0: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
c8d0: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
c8e0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
c8f0: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
c900: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
c910: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
c920: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
c930: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
c940: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
c950: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
c960: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
c970: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
c980: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
c990: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
c9a0: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
c9b0: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
c9c0: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
c9d0: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
c9e0: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
c9f0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
ca00: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
ca10: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
ca20: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
ca30: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
ca40: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
ca50: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
ca60: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
ca70: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
ca80: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
ca90: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
caa0: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
cab0: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
cac0: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
cad0: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
cae0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
caf0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
cb00: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
cb10: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
cb20: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
cb30: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
cb40: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
cb50: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
cb60: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
cb70: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
cb80: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
cb90: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
cba0: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
cbb0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
cbc0: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
cbd0: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
cbe0: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
cbf0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
cc00: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
cc10: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
cc20: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
cc30: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
cc40: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
cc50: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
cc60: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
cc70: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
cc80: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
cc90: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
cca0: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
ccb0: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
ccc0: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
ccd0: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
cce0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
ccf0: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
cd00: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
cd10: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
cd20: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
cd30: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
cd40: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
cd50: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
cd60: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
cd70: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
cd80: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
cd90: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
cda0: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
cdb0: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
cdc0: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
cdd0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
cde0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
cdf0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
ce00: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
ce10: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
ce20: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
ce30: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
ce40: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
ce50: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
ce60: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
ce70: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
ce80: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
ce90: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
cea0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
ceb0: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
cec0: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
ced0: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
cee0: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
cef0: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
cf00: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
cf10: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
cf20: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
cf30: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
cf40: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
cf50: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
cf60: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
cf70: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
cf80: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
cf90: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
cfa0: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
cfb0: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
cfc0: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
cfd0: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
cfe0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cff0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
d000: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
d010: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
d020: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
d030: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
d040: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45  k lock;.  int tE
d050: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
d060: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
d070: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
d080: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
d090: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
d0a0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
d0b0: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
d0c0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
d0d0: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
d0e0: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
d0f0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46     azFileLock(pF
d100: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
d110: 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e  leLock), pFile->
d120: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
d130: 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28  .      osGetpid(
d140: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
d150: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
d160: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
d170: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
d180: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
d190: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
d1a0: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
d1b0: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
d1c0: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
d1d0: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
d1e0: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
d1f0: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
d200: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
d210: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
d220: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
d230: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
d240: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
d250: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
d260: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
d270: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
d280: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
d290: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d2a0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
d2b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
d2c0: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
d2d0: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
d2e0: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
d2f0: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
d300: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
d310: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
d320: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
d330: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
d340: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
d350: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
d360: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
d370: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
d380: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
d390: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
d3a0: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
d3b0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
d3c0: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
d3d0: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
d3e0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
d3f0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
d400: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
d410: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
d420: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
d430: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
d440: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d450: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
d460: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
d470: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
d480: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
d490: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
d4a0: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
d4b0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
d4c0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
d4d0: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
d4e0: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
d4f0: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
d500: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
d510: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
d520: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
d530: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
d540: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
d550: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
d560: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
d570: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
d580: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
d590: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
d5a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
d5b0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
d5c0: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
d5d0: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
d5e0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
d5f0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
d600: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
d610: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
d620: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
d630: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
d640: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
d650: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
d660: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
d670: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
d680: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
d690: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
d6a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d6b0: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
d6c0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d6d0: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
d6e0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d6f0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
d700: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
d710: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
d720: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
d730: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
d740: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
d750: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
d760: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
d770: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d780: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
d790: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
d7a0: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
d7b0: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
d7c0: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
d7d0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
d7e0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
d7f0: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
d800: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
d810: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
d820: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
d830: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
d840: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
d850: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
d860: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
d870: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
d880: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
d890: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
d8a0: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
d8b0: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
d8c0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
d8d0: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
d8e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
d8f0: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
d900: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
d910: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
d920: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
d930: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
d940: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
d950: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d960: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
d970: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
d980: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
d990: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
d9a0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
d9b0: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
d9c0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d9d0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d9e0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d9f0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
da00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
da10: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
da20: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
da30: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
da40: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
da50: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
da60: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
da70: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
da80: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
da90: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
daa0: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
dab0: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
dac0: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
dad0: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
dae0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
daf0: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
db00: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
db10: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
db20: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
db30: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
db40: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
db50: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
db60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
db70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
db80: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
db90: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
dba0: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
dbb0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
dbc0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
dbd0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
dbe0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
dbf0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dc00: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
dc10: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dc20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
dc30: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
dc40: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
dc50: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
dc60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
dc70: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
dc80: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
dc90: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
dca0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
dcb0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
dcc0: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
dcd0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
dce0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
dcf0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
dd00: 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  k) && rc==SQLITE
dd10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
dd20: 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65  This could happe
dd30: 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b  n with a network
dd40: 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   mount */.      
dd50: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
dd60: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
dd70: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
dd80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
dd90: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
dda0: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
ddb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
ddc0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
ddd0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
dde0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
ddf0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  _lock;.    }else
de00: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
de10: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
de20: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
de30: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
de40: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
de50: 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
de60: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
de70: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
de80: 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
de90: 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
dea0: 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
deb0: 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
dec0: 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
ded0: 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
dee0: 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  his.    ** same 
def0: 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
df00: 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
df10: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
df20: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
df30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
df40: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
df50: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
df60: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
df70: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
df80: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
df90: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
dfa0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
dfb0: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
dfc0: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
dfd0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  */.    assert( 0
dfe0: 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
dff0: 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck );.    lock.l
e000: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
e010: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  ..    assert( eF
e020: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
e030: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  D_LOCK || eFileL
e040: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e050: 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65  OCK );.    if( e
e060: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
e070: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
e080: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e090: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
e0a0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
e0b0: 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 1L;.    }else{
e0c0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
e0d0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
e0e0: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
e0f0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
e100: 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ZE;.    }..    i
e110: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
e120: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
e130: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
e140: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
e150: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
e160: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
e170: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
e180: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
e190: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
e1a0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
e1b0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
e1c0: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
e1d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e1e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e1f0: 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75  DEBUG.  /* Set u
e200: 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
e210: 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n-counter change
e220: 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20   checking flags 
e230: 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69  when.  ** transi
e240: 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53  tioning from a S
e250: 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52  HARED to a RESER
e260: 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63  VED lock.  The c
e270: 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  hange.  ** from 
e280: 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
e290: 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67  ED marks the beg
e2a0: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d  inning of a norm
e2b0: 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70  al.  ** write op
e2c0: 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68  eration (not a h
e2d0: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
e2e0: 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ack)..  */.  if(
e2f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
e300: 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c    && pFile->eFil
e310: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
e320: 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f  CK.   && eFileLo
e330: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
e340: 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  K.  ){.    pFile
e350: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
e360: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
e370: 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
e380: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
e390: 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a  lWrite = 1;.  }.
e3a0: 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72  #endif...  if( r
e3b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e3c0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e3d0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
e3e0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
e3f0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
e400: 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
e410: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
e420: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
e430: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
e440: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
e450: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
e460: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
e470: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e  NG_LOCK;.  }..en
e480: 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
e490: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
e4a0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
e4b0: 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c  %d %s %s (unix)\
e4c0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
e4d0: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
e4e0: 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d  ck), .      rc==
e4f0: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
e500: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
e510: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e520: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c  *.** Add the fil
e530: 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65  e descriptor use
e540: 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65  d by file handle
e550: 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f   pFile to the co
e560: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70  rresponding.** p
e570: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  Unused list..*/.
e580: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50  static void setP
e590: 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c  endingFd(unixFil
e5a0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
e5b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
e5c0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
e5d0: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
e5e0: 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70  Fd *p = pFile->p
e5f0: 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65  Unused;.  p->pNe
e600: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
e610: 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
e620: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
e630: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
e640: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d  pFile->pUnused =
e650: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77   0;.}../*.** Low
e660: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
e670: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
e680: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
e690: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
e6a0: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
e6b0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
e6c0: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
e6d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
e6e0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
e6f0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e700: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
e710: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
e720: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
e730: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
e740: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
e750: 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e  p..** .** If han
e760: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20  dleNFSUnlock is 
e770: 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f  true, then on do
e780: 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43  wngrading an EXC
e790: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53  LUSIVE_LOCK to S
e7a0: 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74  HARED.** the byt
e7b0: 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64  e range is divid
e7c0: 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20  ed into 2 parts 
e7d0: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61  and the first pa
e7e0: 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74  rt is unlocked t
e7f0: 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20  hen.** set to a 
e800: 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  read lock, then 
e810: 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69  the other part i
e820: 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65  s simply unlocke
e830: 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a  d.  This works .
e840: 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20  ** around a bug 
e850: 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64  in BSD NFS lockd
e860: 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d   (also seen on M
e870: 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61  acOSX 10.3+) tha
e880: 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72  t fails to .** r
e890: 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20  emove the write 
e8a0: 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e  lock on a region
e8b0: 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
e8c0: 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  k is set..*/.sta
e8d0: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c  tic int posixUnl
e8e0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e8f0: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
e900: 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e  ock, int handleN
e910: 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69  FSUnlock){.  uni
e920: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e930: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
e940: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
e950: 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  Inode;.  struct 
e960: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
e970: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e980: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e990: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
e9a0: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
e9b0: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
e9c0: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
e9d0: 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
e9e0: 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65  ock,.      pFile
e9f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
ea00: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
ea10: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
ea20: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
ea30: 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 29 29       osGetpid())
ea40: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
ea50: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
ea60: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
ea70: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
ea80: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
ea90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
eaa0: 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
eab0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
eac0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
ead0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
eae0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
eaf0: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
eb00: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
eb10: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
eb20: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
eb30: 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
eb40: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23  >eFileLock );..#
eb50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
eb60: 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
eb70: 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
eb80: 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
eb90: 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
eba0: 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
ebb0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
ebc0: 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
ebd0: 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
ebe0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
ebf0: 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
ec00: 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
ec10: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
ec20: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
ec30: 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
ec40: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
ec50: 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
ec60: 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
ec70: 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
ec80: 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
ec90: 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
eca0: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
ecb0: 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
ecc0: 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
ecd0: 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
ece0: 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
ecf0: 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
ed00: 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
ed10: 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
ed20: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
ed30: 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65      */.    pFile
ed40: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
ed50: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
ed60: 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   /* downgrading 
ed70: 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
ed80: 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73   on NFS involves
ed90: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72   clearing the wr
eda0: 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  ite lock.    ** 
edb0: 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68  before establish
edc0: 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b  ing the readlock
edd0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61   - to avoid a ra
ede0: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20  ce condition we 
edf0: 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a  downgrade.    **
ee00: 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62   the lock in 2 b
ee10: 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70  locks, so that p
ee20: 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
ee30: 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64   will be covered
ee40: 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72   by a .    ** wr
ee50: 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  ite lock until t
ee60: 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72  he rest is cover
ee70: 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63  ed by a read loc
ee80: 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20  k:.    **  1:   
ee90: 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20  [WWWWW].    **  
eea0: 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20  2:   [....W].   
eeb0: 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57   **  3:   [RRRRW
eec0: 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b  ].    **  4:   [
eed0: 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20  RRRR.].    */.  
eee0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
eef0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
ef00: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41  #if !defined(__A
ef10: 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49  PPLE__) || !SQLI
ef20: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
ef30: 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76  G_STYLE.      (v
ef40: 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  oid)handleNFSUnl
ef50: 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
ef60: 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  t( handleNFSUnlo
ef70: 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ck==0 );.#endif.
ef80: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
ef90: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
efa0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
efb0: 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
efc0: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
efd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
efe0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
eff0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
f000: 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63  de from system c
f010: 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  all errors */.  
f020: 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53        off_t divS
f030: 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  ize = SHARED_SIZ
f040: 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  E - 1;.        .
f050: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
f060: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
f070: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
f080: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
f090: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f0a0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
f0b0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
f0c0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
f0d0: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
f0e0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f0f0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
f100: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
f110: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f120: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f130: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f140: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f150: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
f160: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f170: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
f180: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
f190: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f1a0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
f1b0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
f1c0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f1d0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
f1e0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
f1f0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
f200: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f210: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
f220: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
f230: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
f240: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
f250: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f260: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
f270: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
f280: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f290: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
f2a0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
f2b0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
f2c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
f2d0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
f2e0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
f2f0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
f300: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
f310: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
f320: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
f330: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
f340: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
f350: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
f360: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
f370: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
f380: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
f390: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
f3a0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f3b0: 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
f3c0: 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
f3d0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
f3e0: 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
f3f0: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
f400: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f410: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
f420: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
f430: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
f440: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f450: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
f460: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
f470: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
f480: 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
f490: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
f4a0: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
f4b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
f4c0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
f4d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4e0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
f4f0: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
f500: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
f510: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
f520: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  E */.      {.   
f530: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
f540: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
f550: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
f560: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
f570: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
f580: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
f590: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f5a0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
f5b0: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IZE;.        if(
f5c0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f5d0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
f5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74           /* In t
f5f0: 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20  heory, the call 
f600: 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  to unixFileLock(
f610: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65  ) cannot fail be
f620: 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20  cause another.  
f630: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
f640: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  ss is holding an
f650: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f   incompatible lo
f660: 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ck. If it does, 
f670: 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
f680: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ** indicates tha
f690: 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63  t the other proc
f6a0: 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
f6b0: 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67  wing the locking
f6c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
f6d0: 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20  otocol. If this 
f6e0: 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20  happens, return 
f6f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
f700: 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20  OCK. Returning. 
f710: 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
f720: 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f  TE_BUSY would co
f730: 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72 20  nfuse the upper 
f740: 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74 69  layer (in practi
f750: 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20 20  ce it causes .  
f760: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73          ** an as
f770: 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a  sert to fail). *
f780: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  / .          rc 
f790: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
f7a0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  DLOCK;.         
f7b0: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
f7c0: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
f7d0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
f7e0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
f7f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f800: 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  }.    lock.l_typ
f810: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
f820: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f830: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
f840: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
f850: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
f860: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b  lock.l_len = 2L;
f870: 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e    assert( PENDIN
f880: 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56  G_BYTE+1==RESERV
f890: 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69  ED_BYTE );.    i
f8a0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f8b0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
f8c0: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
f8d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
f8e0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
f8f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
f900: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f910: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
f920: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
f930: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
f940: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f960: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
f970: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65  OCK ){.    /* De
f980: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
f990: 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
f9a0: 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
f9b0: 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
f9c0: 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
f9d0: 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
f9e0: 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
f9f0: 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
fa00: 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
fa10: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
fa20: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
fa30: 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
fa40: 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
fa50: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
fa60: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
fa70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
fa80: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
fa90: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
faa0: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
fab0: 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e  0L;.      if( un
fac0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
fad0: 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20  , &lock)==0 ){. 
fae0: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
faf0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
fb00: 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
fb10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
fb20: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
fb30: 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  K;.        store
fb40: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
fb50: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20   errno);.       
fb60: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
fb70: 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
fb80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
fb90: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
fba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fbb0: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
fbc0: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
fbd0: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
fbe0: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
fbf0: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
fc00: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
fc10: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
fc20: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
fc30: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
fc40: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
fc50: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
fc60: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
fc70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
fc80: 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
fc90: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
fca0: 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
fcb0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
fcc0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ck==0 ){.      c
fcd0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
fce0: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
fcf0: 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20  ..end_unlock:.  
fd00: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
fd10: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
fd20: 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
fd30: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
fd40: 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
fd50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
fd60: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
fd70: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
fd80: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
fd90: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
fda0: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
fdb0: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
fdc0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
fdd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
fde0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
fdf0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
fe00: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
fe10: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
fe20: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
fe30: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
fe40: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
fe50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fe60: 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  unixUnlock(sqlit
fe70: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
fe80: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66   eFileLock){.#if
fe90: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
fea0: 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74  _SIZE>0.  assert
feb0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
fec0: 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e  RED_LOCK || ((un
fed0: 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46  ixFile *)id)->nF
fee0: 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65  etchOut==0 );.#e
fef0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f  ndif.  return po
ff00: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
ff10: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
ff20: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
ff30: 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69  MAP_SIZE>0.stati
ff40: 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c  c int unixMapfil
ff50: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  e(unixFile *pFd,
ff60: 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61   i64 nByte);.sta
ff70: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d  tic void unixUnm
ff80: 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
ff90: 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  *pFd);.#endif../
ffa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ffb0: 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  on performs the 
ffc0: 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c  parts of the "cl
ffd0: 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74  ose file" operat
ffe0: 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74  ion .** common t
fff0: 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63  o all locking sc
10000 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73  hemes. It closes
10010 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
10020 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c  nd file.** handl
10030 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20  es, if they are 
10040 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20  valid, and sets 
10050 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
10060 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  e unixFile.** st
10070 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a  ructure to 0..**
10080 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20  .** It is *not* 
10090 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c  necessary to hol
100a0 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e  d the mutex when
100b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
100c0 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e   called,.** even
100d0 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20   on VxWorks.  A 
100e0 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63  mutex will be ac
100f0 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b  quired on VxWork
10100 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f  s by the.** vxwo
10110 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
10120 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
10130 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55  tatic int closeU
10140 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f  nixFile(sqlite3_
10150 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
10160 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10170 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69  unixFile*)id;.#i
10180 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
10190 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55  P_SIZE>0.  unixU
101a0 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
101b0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46  .#endif.  if( pF
101c0 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ile->h>=0 ){.   
101d0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
101e0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f  ile, pFile->h, _
101f0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46  _LINE__);.    pF
10200 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d  ile->h = -1;.  }
10210 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
10220 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64    if( pFile->pId
10230 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
10240 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
10250 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29  NIXFILE_DELETE )
10260 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  {.      osUnlink
10270 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61  (pFile->pId->zCa
10280 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
10290 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52    }.    vxworksR
102a0 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69  eleaseFileId(pFi
102b0 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46  le->pId);.    pF
102c0 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20  ile->pId = 0;.  
102d0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
102e0 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46  SQLITE_UNLINK_AF
102f0 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20  TER_CLOSE.  if( 
10300 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
10310 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
10320 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69  TE ){.    osUnli
10330 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  nk(pFile->zPath)
10340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
10350 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46 69  ee(*(char**)&pFi
10360 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
10370 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30  pFile->zPath = 0
10380 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
10390 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20  STRACE(("CLOSE  
103a0 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
103b0 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  >h));.  OpenCoun
103c0 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74  ter(-1);.  sqlit
103d0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70  e3_free(pFile->p
103e0 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65  Unused);.  memse
103f0 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
10400 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
10410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10420 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
10430 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
10440 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
10450 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10460 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
10470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
10480 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10490 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
104a0 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 46   verifyDbFile(pF
104b0 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f  ile);.  unixUnlo
104c0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
104d0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
104e0 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46  x();..  /* unixF
104f0 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c  ile.pInode is al
10500 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e  ways valid here.
10510 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69   Otherwise, a di
10520 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20  fferent close.  
10530 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e  ** routine (e.g.
10540 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20   nolockClose()) 
10550 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  would be called 
10560 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  instead..  */.  
10570 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
10580 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
10590 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
105a0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
105b0 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
105c0 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20  (pFile->pInode) 
105d0 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
105e0 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
105f0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
10600 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
10610 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
10620 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
10630 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
10640 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
10650 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
10660 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
10670 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
10680 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
10690 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
106a0 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
106b0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
106c0 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a  ly closed .    *
106d0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
106e0 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
106f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50  .    */.    setP
10700 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
10710 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e  .  }.  releaseIn
10720 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
10730 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
10740 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
10750 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
10760 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
10780 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
10790 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
107a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
107c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 4e 6f  ************* No
10880 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
10890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
108b0 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
108c0 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
108d0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
108e0 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
108f0 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
10900 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
10910 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
10920 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
10930 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
10940 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
10950 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
10960 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
10970 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
10980 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
10990 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
109a0 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
109b0 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
109c0 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
109d0 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
109e0 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
109f0 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
10a00 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
10a10 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
10a20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
10a30 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
10a40 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
10a50 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
10a60 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
10a70 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
10a80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
10a90 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
10aa0 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
10ab0 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
10ac0 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
10ad0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
10ae0 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
10af0 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
10b00 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
10b10 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
10b20 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
10b30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10b40 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
10b50 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
10b60 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
10b70 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
10b80 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
10b90 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
10ba0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
10bb0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
10bc0 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
10bd0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
10be0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
10bf0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
10c00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10c10 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
10c20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
10c30 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
10c40 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
10c50 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
10c60 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
10c70 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
10c80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10c90 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10ca0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
10cb0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
10cc0 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
10cd0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10ce0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
10cf0 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
10d00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10d10 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
10d20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10d30 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
10d40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
10d50 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
10d60 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
10d70 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
10d80 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
10d90 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
10da0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
10e10 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e60 0a 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 20 42 65 67 69 6e  ********** Begin
10e80 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
10e90 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
10ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10eb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
10ec0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
10ed0 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
10ee0 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
10ef0 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
10f00 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61   files (really a
10f10 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63   directory) to c
10f20 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
10f30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10f40 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e  This works.** on
10f50 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72   just about ever
10f60 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
10f70 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
10f80 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
10f90 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
10fa0 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
10fb0 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
10fc0 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
10fd0 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
10fe0 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
10ff0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
11000 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
11010 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
11020 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
11030 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
11040 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
11050 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
11060 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
11070 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
11080 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
11090 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
110a0 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
110b0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
110c0 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
110d0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
110e0 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
110f0 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
11100 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
11110 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
11120 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
11130 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
11140 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63  ating a subdirec
11150 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65  tory in the same
11160 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
11170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
11180 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
11190 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
111a0 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
111b0 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
111c0 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c  existence of a l
111d0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d  ock directory im
111e0 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
111f0 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
11200 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65  her.** lock type
11210 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
11220 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
11230 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
11240 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
11250 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
11260 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
11270 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
11280 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
11290 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
112a0 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a  k directory..*/.
112b0 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
112c0 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
112d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
112e0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
112f0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
11300 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
11310 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
11320 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
11330 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
11340 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
11350 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11360 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11370 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11380 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11390 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
113a0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
113b0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
113c0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
113d0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
113e0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
113f0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
11400 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
11410 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
11420 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
11430 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
11440 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
11450 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
11460 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
11470 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
11480 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
11490 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
114a0 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
114b0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
114c0 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
114d0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
114e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
114f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11500 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
11510 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11520 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
11530 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
11540 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11550 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
11560 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11570 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
11580 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
11590 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
115a0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
115b0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
115c0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
115d0 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
115e0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
115f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
11600 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
11610 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
11620 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
11630 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
11640 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
11650 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
11660 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
11670 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
11680 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
11690 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
116a0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
116b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
116c0 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
116d0 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
116e0 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
116f0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
11700 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
11710 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
11720 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
11730 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
11740 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73  erved = osAccess
11750 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d  (zLockFile, 0)==
11760 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  0;.  }.  OSTRACE
11770 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
11780 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63  %d %d %d (dotloc
11790 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
117a0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
117b0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
117c0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
117d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
117e0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
117f0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
11800 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
11810 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
11820 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
11830 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
11840 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
11850 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
11860 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
11870 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
11880 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
11890 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
118a0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
118b0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
118c0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
118d0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
118e0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
118f0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
11900 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
11910 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
11920 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
11930 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
11940 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
11950 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
11960 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
11970 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
11980 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
11990 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
119a0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
119b0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
119c0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
119d0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
119e0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
119f0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
11a00 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
11a10 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
11a20 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
11a30 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11a40 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
11a50 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
11a60 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
11a70 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
11a80 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
11a90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
11aa0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
11ab0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
11ac0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
11ad0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
11ae0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
11af0 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57  g level..**.** W
11b00 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b  ith dotfile lock
11b10 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f  ing, we really o
11b20 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74  nly support stat
11b30 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45  e (4): EXCLUSIVE
11b40 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63  ..** But we trac
11b50 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b  k the other lock
11b60 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72  ing levels inter
11b70 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  nally..*/.static
11b80 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   int dotlockLock
11b90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11ba0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
11bb0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
11bc0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11bd0 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
11be0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
11bf0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
11c00 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
11c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11c20 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
11c30 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
11c40 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
11c50 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
11c60 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
11c70 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
11c80 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
11c90 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
11ca0 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
11cb0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
11cc0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ock > NO_LOCK ){
11cd0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
11ce0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
11cf0 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  k;.    /* Always
11d00 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
11d10 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
11d20 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20   file */.#ifdef 
11d30 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75  HAVE_UTIME.    u
11d40 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  time(zLockFile, 
11d50 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20  NULL);.#else.   
11d60 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
11d70 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
11d80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11d90 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
11da0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
11db0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72  sive lock */.  r
11dc0 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63  c = osMkdir(zLoc
11dd0 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20  kFile, 0777);.  
11de0 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
11df0 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* failed to ope
11e00 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63  n/create the loc
11e10 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  k directory */. 
11e20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11e30 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
11e40 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
11e50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11e60 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
11e70 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
11e80 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
11e90 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
11ea0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
11eb0 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
11ec0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11ed0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
11ee0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
11ef0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
11f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11f10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
11f20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
11f30 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
11f40 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
11f50 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11f60 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11f80 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
11f90 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
11fa0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11fb0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
11fc0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
11fd0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
11fe0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
11ff0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
12000 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
12010 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
12020 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
12030 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
12040 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
12050 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
12060 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
12070 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
12080 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   When the lockin
12090 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20  g level reaches 
120a0 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20  NO_LOCK, delete 
120b0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  the lock file..*
120c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
120d0 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
120e0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
120f0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
12100 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12110 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12120 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
12130 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
12140 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
12150 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  xt;.  int rc;.. 
12160 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12170 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
12180 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
12190 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f  %d pid=%d (dotlo
121a0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
121b0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
121c0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
121d0 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
121e0 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
121f0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
12200 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12210 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
12220 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
12230 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
12240 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
12250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12260 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
12270 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
12280 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
12290 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
122a0 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
122b0 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
122c0 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
122d0 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
122e0 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
122f0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
12300 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12310 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12320 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
12330 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12340 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
12350 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
12360 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
12370 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
12380 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
12390 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
123a0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
123b0 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
123c0 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26  e);.  if( rc<0 &
123d0 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52  & errno==ENOTDIR
123e0 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b   ) rc = osUnlink
123f0 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
12400 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
12410 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12420 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  o;.    rc = 0;. 
12430 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
12440 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
12450 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
12460 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RR_UNLOCK;.    }
12470 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
12480 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
12490 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
124a0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
124b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
124c0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
124d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
124e0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
124f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12500 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
12510 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
12520 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
12530 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
12540 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
12550 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
12560 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
12570 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
12580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12590 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
125a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
125b0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
125c0 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
125d0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
125e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
125f0 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
12600 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
12610 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
12620 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
12630 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
12650 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
12660 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
12670 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a  ****************
12720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
12750 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
12780 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
12790 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
127a0 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
127b0 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
127c0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
127d0 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
127e0 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
127f0 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
12800 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
12810 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
12820 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
12830 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
12840 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
12850 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
12860 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
12870 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
12880 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
12890 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
128a0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
128b0 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
128c0 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
128d0 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
128e0 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
128f0 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
12900 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
12910 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
12920 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
12930 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
12940 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
12950 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
12960 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
12970 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
12980 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  off.*/.#if SQLIT
12990 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
129a0 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65  _STYLE../*.** Re
129b0 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c  try flock() call
129c0 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68  s that fail with
129d0 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66   EINTR.*/.#ifdef
129e0 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e   EINTR.static in
129f0 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69  t robust_flock(i
12a00 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a  nt fd, int op){.
12a10 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20    int rc;.  do{ 
12a20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70  rc = flock(fd,op
12a30 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
12a40 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
12a50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12a60 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
12a70 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c   robust_flock(a,
12a80 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65  b) flock(a,b).#e
12a90 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a  ndif.     ../*.*
12aa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12ab0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
12ac0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
12ad0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
12ae0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
12af0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
12b00 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
12b10 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
12b20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
12b30 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
12b40 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
12b50 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
12b60 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
12b70 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
12b80 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
12b90 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
12ba0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
12bb0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
12bc0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
12bd0 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52   int flockCheckR
12be0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
12bf0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12c00 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
12c10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12c20 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
12c30 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
12c40 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
12c50 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53  File*)id;.  .  S
12c60 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12c80 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
12c90 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
12ca0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12cb0 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
12cc0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
12cd0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
12ce0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
12cf0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
12d00 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
12d10 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
12d20 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
12d30 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
12d40 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
12d50 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
12d60 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
12d70 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74  ved ){.    /* at
12d80 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  tempt to get the
12d90 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
12da0 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c   lrc = robust_fl
12db0 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
12dc0 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
12dd0 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29  ;.    if( !lrc )
12de0 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74  {.      /* got t
12df0 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  he lock, unlock 
12e00 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  it */.      lrc 
12e10 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
12e20 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
12e30 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72  );.      if ( lr
12e40 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  c ) {.        in
12e50 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12e60 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c  ;.        /* unl
12e70 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20  ock failed with 
12e80 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
12e90 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45      lrc = SQLITE
12ea0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
12eb0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
12ec0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
12ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  {.          stor
12ee0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
12ef0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
12f00 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
12f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12f20 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
12f30 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
12f40 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
12f50 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
12f60 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
12f70 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
12f80 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
12f90 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
12fa0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
12fb0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
12fc0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
12fd0 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
12fe0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
12ff0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
13000 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
13010 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  rno);.        rc
13020 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = lrc;.      }.
13030 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
13040 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
13050 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f  CK %d %d %d (flo
13060 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
13070 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
13080 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
13090 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
130a0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
130b0 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
130c0 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
130d0 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
130e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
130f0 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
13100 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13110 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
13120 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
13130 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
13140 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
13150 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
13160 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
13170 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
13180 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
13190 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
131a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
131b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
131c0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
131d0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
131e0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
131f0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
13200 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
13210 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
13220 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
13230 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
13240 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
13250 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
13260 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
13270 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
13280 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
13290 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
132a0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
132b0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
132c0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
132d0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
132e0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
132f0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
13300 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
13310 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
13320 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
13330 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
13340 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
13350 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
13360 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
13370 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13380 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13390 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
133a0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
133b0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
133c0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
133d0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
133e0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
133f0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
13400 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  USIVE.**.** floc
13410 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  k() only really 
13420 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
13430 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
13440 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
13450 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
13460 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
13470 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
13480 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
13490 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
134a0 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
134b0 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
134c0 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
134d0 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
134e0 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
134f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
13500 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
13510 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
13520 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
13530 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
13540 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
13550 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
13560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
13570 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
13580 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
13590 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e  FileLock) {.  in
135a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
135b0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
135c0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
135d0 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
135e0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69  pFile );..  /* i
135f0 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
13600 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
13610 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
13620 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
13630 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
13640 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
13650 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
13660 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
13670 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
13680 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13690 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
136a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
136b0 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
136c0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
136d0 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74  .  .  if (robust
136e0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
136f0 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
13700 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74  NB)) {.    int t
13710 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
13720 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74     /* didn't get
13730 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a  , must be busy *
13740 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
13750 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
13760 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
13770 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
13780 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
13790 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
137a0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
137b0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
137c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  );.    }.  } els
137d0 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
137e0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
137f0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
13800 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13810 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
13820 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
13830 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
13840 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
13850 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
13860 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
13870 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
13880 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
13890 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
138a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
138b0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
138c0 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
138d0 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
138e0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
138f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13900 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
13910 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
13920 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
13930 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
13940 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
13950 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13960 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13970 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13980 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13990 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
139a0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
139b0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
139c0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
139d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
139e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
139f0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
13a00 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
13a10 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
13a20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
13a30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13a40 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13a50 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
13a60 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13a70 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
13a80 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
13a90 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13aa0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
13ab0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13ac0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
13ad0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
13ae0 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
13af0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
13b00 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
13b10 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13b20 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 29 29 29  ck, osGetpid()))
13b30 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
13b40 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
13b50 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
13b60 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
13b70 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13b80 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
13b90 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
13ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13bb0 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
13bc0 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
13bd0 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
13be0 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
13bf0 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
13c00 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
13c10 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
13c20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
13c30 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
13c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13c50 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
13c60 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
13c70 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f  */.  if( robust_
13c80 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
13c90 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64  LOCK_UN) ){.#ifd
13ca0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
13cb0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13cc0 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  RS.    return SQ
13cd0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20  LITE_OK;.#endif 
13ce0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
13cf0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13d00 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  RS */.    return
13d10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
13d20 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LOCK;.  }else{. 
13d30 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13d40 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
13d50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13d60 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
13d70 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
13d80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
13d90 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
13da0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
13db0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13dc0 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
13dd0 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
13de0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
13df0 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
13e00 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ile(id);.  }.  r
13e10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
13e20 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
13e30 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
13e40 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
13e50 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */../**********
13e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13e70 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20   the flock lock 
13e80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
13e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ea0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
13eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ef0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
13f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f10 2a 2a 2a 2a 2a 2a 2a 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 0a 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 20 42  ************** B
13f60 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70  egin Named Semap
13f70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  hore Locking ***
13f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f90 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65  *****.**.** Name
13fa0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
13fb0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70  ing is only supp
13fc0 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  orted on VxWorks
13fd0 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  ..**.** Semaphor
13fe0 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  e locking is lik
13ff0 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66  e dot-lock and f
14000 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20  lock in that it 
14010 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73  really only.** s
14020 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56  upports EXCLUSIV
14030 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79  E locking.  Only
14040 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
14050 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72  s can read or wr
14060 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ite.** the datab
14070 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69  ase file at a ti
14080 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  me.  This reduce
14090 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63  s potential conc
140a0 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20  urrency, but.** 
140b0 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69  makes the lock i
140c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75  mplementation mu
140d0 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69  ch easier..*/.#i
140e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a  f OS_VXWORKS../*
140f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14100 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
14110 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
14120 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14130 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
14140 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
14150 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
14160 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
14170 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
14180 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
14190 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
141a0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
141b0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
141c0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
141d0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
141e0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
141f0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
14200 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
14210 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
14220 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63 6b  ic int semXCheck
14230 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
14240 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14250 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
14260 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14270 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
14280 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
14290 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
142a0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
142b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
142c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
142d0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
142e0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
142f0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14300 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
14310 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
14320 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
14330 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
14340 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
14350 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
14360 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
14370 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
14380 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
14390 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
143a0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
143b0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
143c0 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
143d0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
143e0 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20  node->pSem;..   
143f0 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
14400 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
14410 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
14420 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
14430 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72  ( EAGAIN != tErr
14440 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
14450 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
14460 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
14470 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
14480 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14490 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74  OCK);.        st
144a0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
144b0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
144c0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
144d0 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
144e0 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
144f0 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20   when we are in 
14500 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20  NO_LOCK */.     
14510 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70     reserved = (p
14520 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14530 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  < SHARED_LOCK);.
14540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14550 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63  e{.      /* we c
14560 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20  ould have it if 
14570 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20  we want it */.  
14580 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65      sem_post(pSe
14590 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  m);.    }.  }.  
145a0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
145b0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
145c0 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
145d0 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
145e0 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
145f0 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
14600 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14610 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
14620 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
14630 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
14640 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
14650 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
14660 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
14670 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
14680 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
14690 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
146a0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
146b0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
146c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
146d0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
146e0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
146f0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
14700 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
14710 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
14720 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
14730 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
14740 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
14750 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
14760 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
14770 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
14780 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
14790 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
147a0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
147b0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
147c0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
147d0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
147e0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
147f0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
14800 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
14810 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
14820 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
14830 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
14840 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
14850 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
14860 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
14870 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
14880 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
14890 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
148a0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
148b0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
148c0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
148d0 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ocks only really
148e0 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
148f0 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
14900 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
14910 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
14920 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
14930 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
14940 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
14950 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
14960 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
14970 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
14980 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
14990 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
149a0 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
149b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
149c0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
149d0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
149e0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
149f0 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
14a00 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
14a10 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
14a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14a30 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33  semXLock(sqlite3
14a40 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14a50 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
14a60 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14a70 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14a80 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
14a90 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
14aa0 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
14ab0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
14ac0 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
14ad0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
14ae0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
14af0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
14b00 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
14b10 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
14b20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
14b30 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
14b40 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
14b50 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
14b60 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
14b70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
14b80 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
14b90 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
14ba0 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
14bb0 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
14bc0 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
14bd0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
14be0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
14bf0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14c00 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
14c10 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
14c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
14c30 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
14c40 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
14c50 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
14c60 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14c70 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
14c80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14c90 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
14ca0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14cb0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
14cc0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
14cd0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
14ce0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
14cf0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
14d00 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
14d10 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
14d20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
14d30 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
14d40 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
14d50 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
14d60 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
14d70 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
14d80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
14d90 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 55  static int semXU
14da0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
14db0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14dc0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
14dd0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14de0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
14df0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
14e00 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
14e10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
14e20 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
14e30 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
14e40 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
14e50 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
14e60 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
14e70 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
14e80 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
14e90 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74  eFileLock, osGet
14ea0 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
14eb0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
14ec0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
14ed0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
14ee0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
14ef0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14f00 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
14f10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14f20 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
14f30 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
14f40 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
14f50 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
14f60 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
14f70 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if (eFileLock==
14f80 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
14f90 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14fa0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14fb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14fc0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
14fd0 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e  /* no, really un
14fe0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20  lock. */.  if ( 
14ff0 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d  sem_post(pSem)==
15000 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
15010 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  c, tErrno = errn
15020 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  o;.    rc = sqli
15030 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
15040 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
15050 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
15060 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
15070 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
15080 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
15090 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
150a0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
150b0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
150c0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
150d0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
150e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
150f0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
15100 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
15110 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f  atic int semXClo
15120 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
15130 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
15140 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
15150 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15160 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58  le*)id;.    semX
15170 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
15180 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
15190 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
151a0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
151b0 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
151c0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
151d0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
151e0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
151f0 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
15200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15210 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
15220 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
15230 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
15240 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
15250 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
15260 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
15270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
15280 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
15290 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
152a0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
152b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
152c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
15310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15320 2a 2a 2a 2a 2a 2a 2a 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 0a 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 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
15380 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
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 0a 2a 2a  *************.**
153b0 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
153c0 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
153d0 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
153e0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
153f0 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
15400 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
15410 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
15420 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
15430 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
15440 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
15450 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
15460 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
15470 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
15480 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
15490 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
154a0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
154b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
154c0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
154d0 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
154e0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
154f0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
15500 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
15510 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
15520 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
15530 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
15540 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
15550 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
15560 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
15570 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
15580 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
15590 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
155a0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
155b0 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
155c0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
155d0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
155e0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
155f0 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
15600 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
15610 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
15620 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
15630 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
15640 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
15650 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
15660 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
15670 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
15680 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
15690 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
156a0 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
156b0 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
156c0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
156d0 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
156e0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
156f0 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
15700 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
15710 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
15720 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
15730 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15750 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
15760 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
15770 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
15780 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
15790 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
157a0 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
157b0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
157c0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
157d0 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
157e0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
157f0 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
15800 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
15810 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
15820 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
15830 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
15840 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
15850 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
15860 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
15870 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
15880 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
15890 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
158a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
158b0 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
158c0 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
158d0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
158e0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
158f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
15900 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15910 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
15920 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15930 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
15940 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
15950 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
15960 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
15970 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
15980 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
15990 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
159a0 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
159b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
159c0 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
159d0 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
159e0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
159f0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
15a00 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
15a10 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
15a20 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
15a30 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
15a40 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
15a50 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
15a60 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
15a70 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
15a80 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
15a90 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
15aa0 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
15ab0 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
15ac0 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
15ad0 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
15ae0 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
15af0 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
15b00 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
15b10 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
15b20 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
15b30 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
15b40 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
15b50 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
15b60 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
15b70 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
15b80 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
15b90 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15ba0 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
15bb0 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
15bc0 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
15bd0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
15be0 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
15bf0 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
15c00 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
15c10 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
15c20 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
15c30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
15c40 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
15c50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
15c60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
15c70 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
15c80 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
15c90 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
15ca0 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
15cb0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
15cc0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15cd0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
15ce0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
15cf0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15d00 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74  (rc) ){.      st
15d10 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
15d20 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
15d30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
15d40 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
15d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15d60 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
15d70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
15d80 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
15d90 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
15da0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
15db0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
15dc0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
15dd0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
15de0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
15df0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
15e00 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
15e10 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
15e20 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
15e30 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
15e40 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
15e50 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
15e60 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
15e70 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
15e80 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
15e90 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
15ea0 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  nt afpCheckReser
15eb0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
15ec0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
15ed0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
15ee0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15ef0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
15f00 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
15f10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15f20 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  *)id;.  afpLocki
15f30 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
15f40 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  xt;.  .  Simulat
15f50 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
15f60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
15f70 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
15f80 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
15f90 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74   pFile );.  cont
15fa0 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
15fb0 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
15fc0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
15fd0 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74  t;.  if( context
15fe0 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
15ff0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a    *pResOut = 1;.
16000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16010 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
16020 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
16030 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
16040 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
16050 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
16060 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  */.  .  /* Check
16070 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
16080 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
16090 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
160a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
160b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
160c0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
160d0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
160e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
160f0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
16100 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
16110 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
16120 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
16130 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
16140 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
16150 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
16160 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16170 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16180 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
16190 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
161a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
161b0 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
161c0 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
161d0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
161e0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
161f0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
16200 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
16210 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
16220 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
16230 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16240 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16250 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
16260 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
16270 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
16280 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
16290 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
162a0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
162b0 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
162c0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
162d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
162e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
162f0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
16300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
16310 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16320 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
16330 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
16340 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d %d (afp)\n", p
16350 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
16360 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70  erved));.  .  *p
16370 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
16380 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
16390 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
163a0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
163b0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
163c0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
163d0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
163e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
163f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
16400 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
16410 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
16420 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
16430 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
16440 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
16450 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
16460 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
16470 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
16480 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
16490 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
164a0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
164b0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
164c0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
164d0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
164e0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
164f0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
16500 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
16510 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
16520 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
16530 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
16540 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
16550 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
16560 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
16570 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
16580 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
16590 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
165a0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
165b0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
165c0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
165d0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
165e0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
165f0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
16600 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
16610 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
16620 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
16630 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
16640 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
16650 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
16660 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
16670 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
16680 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
16690 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
166a0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
166b0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
166c0 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
166d0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
166e0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  eFileLock){.  in
166f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16700 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
16710 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
16720 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
16730 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
16740 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
16750 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16760 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
16770 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16780 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
16790 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
167a0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
167b0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
167c0 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
167d0 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
167e0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
167f0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
16800 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
16810 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ck), azFileLock(
16820 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16830 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
16840 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d  FileLock(pInode-
16850 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e  >eFileLock), pIn
16860 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f  ode->nShared , o
16870 73 47 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20  sGetpid()));..  
16880 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
16890 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
168a0 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
168b0 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
168c0 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46  n the.  ** unixF
168d0 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
168e0 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61   Don't use the a
168f0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  fp_end_lock: exi
16900 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
16910 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16920 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
16930 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
16940 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
16950 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
16960 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
16970 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
16980 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
16990 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
169a0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
169b0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
169c0 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
169d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
169e0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
169f0 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
16a00 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
16a10 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20  ct.  **  (1) We 
16a20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20  never move from 
16a30 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74  unlocked to anyt
16a40 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e  hing higher than
16a50 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20   shared lock..  
16a60 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e  **  (2) SQLite n
16a70 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  ever explicitly 
16a80 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69  requests a pendi
16a90 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33  g lock..  **  (3
16aa0 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ) A shared lock 
16ab0 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77  is always held w
16ac0 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f  hen a reserve lo
16ad0 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  ck is requested.
16ae0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16af0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16b00 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  !=NO_LOCK || eFi
16b10 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16b20 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
16b30 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44   eFileLock!=PEND
16b40 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
16b50 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
16b60 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
16b70 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  | pFile->eFileLo
16b80 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16b90 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
16ba0 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
16bb0 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
16bc0 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
16bd0 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
16be0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
16bf0 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
16c00 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
16c10 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
16c20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
16c30 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
16c40 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
16c50 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
16c60 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
16c70 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
16c80 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
16c90 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
16ca0 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
16cb0 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
16cc0 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
16cd0 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
16ce0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
16cf0 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
16d00 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
16d10 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53     ){.    rc = S
16d20 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
16d30 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
16d40 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  k;.  }.  .  /* I
16d50 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
16d60 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
16d70 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
16d80 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
16d90 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
16da0 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
16db0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
16dc0 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
16dd0 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
16de0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
16df0 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
16e00 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16e10 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28  _LOCK && .     (
16e20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16e30 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
16e40 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
16e50 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
16e60 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
16e70 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
16e80 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
16e90 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
16ea0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
16eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
16ec0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
16ed0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
16ee0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
16ef0 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
16f00 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
16f10 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
16f20 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
16f30 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20  d_lock;.  }.    
16f40 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
16f50 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
16f60 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
16f70 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
16f80 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
16f90 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
16fa0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
16fb0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
16fc0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
16fd0 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
16fe0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ed..  */.  if( e
16ff0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17000 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
17010 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
17020 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
17030 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
17040 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
17050 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
17060 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61  ;.    failed = a
17070 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17080 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17090 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
170a0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
170b0 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
170c0 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
170d0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
170e0 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
170f0 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f   .  /* If contro
17100 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
17110 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
17120 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
17130 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
17140 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
17150 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
17160 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
17170 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
17180 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
17190 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63     int lrc1, lrc
171a0 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30  2, lrc1Errno = 0
171b0 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d  ;.    long lk, m
171c0 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73  ask;.    .    as
171d0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
171e0 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
171f0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17200 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
17210 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73          .    mas
17220 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67  k = (sizeof(long
17230 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f  )==8) ? LARGEST_
17240 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66  INT64 : 0x7fffff
17250 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  ff;.    /* Now g
17260 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
17270 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a   SHARED_LOCK */.
17280 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74      /* note that
17290 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20   the quality of 
172a0 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64  the randomness d
172b0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68  oesn't matter th
172c0 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c  at much */.    l
172d0 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20  k = random(); . 
172e0 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65     pInode->share
172f0 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61  dByte = (lk & ma
17300 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  sk)%(SHARED_SIZE
17310 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20   - 1);.    lrc1 
17320 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17330 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17340 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
17350 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
17360 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
17370 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20   1, 1);.    if( 
17380 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
17390 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63  c1) ){.      lrc
173a0 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e  1Errno = pFile->
173b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d  lastErrno;.    }
173c0 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
173d0 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
173e0 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
173f0 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  rc2 = afpSetLock
17400 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17410 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
17420 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
17430 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f    .    if( IS_LO
17440 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
17450 20 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61   {.      storeLa
17460 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c  stErrno(pFile, l
17470 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  rc1Errno);.     
17480 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
17490 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
174a0 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ock;.    } else 
174b0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
174c0 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20  R(lrc2) ){.     
174d0 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20   rc = lrc2;.    
174e0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
174f0 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ock;.    } else 
17500 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49  if( lrc1 != SQLI
17510 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20  TE_OK ) {.      
17520 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d  rc = lrc1;.    }
17530 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46   else {.      pF
17540 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
17550 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
17560 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
17570 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
17580 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
17590 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
175a0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
175b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
175c0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
175d0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
175e0 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
175f0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
17600 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
17610 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a  d in this.     *
17620 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
17630 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
17640 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
17650 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
17660 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
17670 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
17680 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
17690 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
176a0 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
176b0 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
176c0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
176d0 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
176e0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
176f0 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
17700 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  y..    */.    in
17710 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  t failed = 0;.  
17720 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
17730 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
17740 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  .    if (eFileLo
17750 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c  ck >= RESERVED_L
17760 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
17770 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56  ileLock < RESERV
17780 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  ED_LOCK) {.     
17790 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20     /* Acquire a 
177a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
177b0 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
177c0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
177d0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
177e0 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
177f0 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20  TE, 1,1);.      
17800 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20  if( !failed ){. 
17810 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
17820 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
17830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17840 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65  if (!failed && e
17850 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c  FileLock == EXCL
17860 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20  USIVE_LOCK) {.  
17870 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
17880 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
17890 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20   */.        .   
178a0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
178b0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66   shared lock bef
178c0 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72  ore trying the r
178d0 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65  ange.  we'll nee
178e0 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72  d to .      ** r
178f0 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
17900 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65  hared lock if we
17910 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20   can't get the  
17920 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  afpUnlock.      
17930 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66  */.      if( !(f
17940 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
17950 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17960 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
17970 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20  D_FIRST +.      
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65     pInode->share
179a0 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b  dByte, 1, 0)) ){
179b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69  .        int fai
179c0 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  led2 = SQLITE_OK
179d0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77  ;.        /* now
179e0 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74   attemmpt to get
179f0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
17a00 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20  ock range */.   
17a10 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
17a20 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17a30 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17a40 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a   SHARED_FIRST, .
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17a70 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a  HARED_SIZE, 1);.
17a80 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c          if( fail
17a90 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d  ed && (failed2 =
17aa0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17ab0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17ac0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
17ae0 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64  ED_FIRST + pInod
17af0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
17b00 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 1)) ){.       
17b10 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73     /* Can't rees
17b20 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
17b30 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65  ed lock.  Sqlite
17b40 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69   can't deal, thi
17b50 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  s is.          *
17b60 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f  * a critical I/O
17b70 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
17b80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
17b90 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51   = ((failed & SQ
17ba0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
17bb0 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66  QLITE_IOERR) ? f
17bc0 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20  ailed2 : .      
17bd0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
17be0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
17bf0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
17c00 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  nd_lock;.       
17c10 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   } .      }else{
17c20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61  .        rc = fa
17c30 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20  iled; .      }. 
17c40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69     }.    if( fai
17c50 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
17c60 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  = failed;.    }.
17c70 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
17c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17c90 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17ca0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
17cb0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17cc0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17cd0 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
17ce0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
17cf0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
17d00 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17d10 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
17d20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
17d30 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
17d40 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66  _LOCK;.  }.  .af
17d50 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  p_end_lock:.  un
17d60 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
17d70 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
17d80 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66      %d %s %s (af
17d90 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
17da0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
17db0 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
17dc0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
17dd0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
17de0 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
17df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
17e00 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
17e10 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
17e20 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
17e30 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
17e40 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
17e50 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
17e60 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
17e70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
17e80 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
17e90 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17ea0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
17eb0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
17ec0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
17ed0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
17ee0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
17f00 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  fpUnlock(sqlite3
17f10 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
17f20 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e  FileLock) {.  in
17f30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17f40 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
17f50 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
17f60 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
17f70 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
17f80 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
17f90 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
17fa0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
17fb0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
17fc0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
17fd0 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a  skipShared = 0;.
17fe0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
17ff0 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69  ST.  int h = pFi
18000 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20  le->h;.#endif.. 
18010 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
18020 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
18030 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
18040 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
18050 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
18060 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
18070 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18080 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
18090 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
180a0 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
180b0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
180c0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 70            osGetp
180d0 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  id()));..  asser
180e0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
180f0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
18100 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
18110 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
18120 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18130 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
18140 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
18150 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
18160 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
18170 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
18180 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
18190 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
181a0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
181b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
181c0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
181d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
181e0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
181f0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
18200 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18210 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
18220 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18230 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
18240 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
18250 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
18260 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
18270 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
18280 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
18290 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
182a0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
182b0 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
182c0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
182d0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
182e0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
182f0 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
18300 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
18310 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
18320 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
18330 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
18340 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
18350 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
18360 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
18370 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
18380 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
18390 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
183a0 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
183b0 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
183c0 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
183d0 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
183e0 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
183f0 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
18400 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
18410 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
18420 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
18430 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
18440 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
18450 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
18460 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
18470 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
18480 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
18490 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
184a0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
184b0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
184c0 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
184d0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  >eFileLock==EXCL
184e0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
184f0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
18500 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18510 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
18520 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
18530 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
18540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18550 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
18560 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
18570 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18580 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >1) ){.        /
18590 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c  * only re-establ
185a0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
185b0 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ock if necessary
185c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
185d0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
185e0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
185f0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
18600 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
18610 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18620 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18630 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
18640 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 1, 1);.      }
18650 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
18660 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a  skipShared = 1;.
18670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18680 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18690 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
186a0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
186b0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
186c0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
186d0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
186e0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
186f0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
18700 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  } .    if( rc==S
18710 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
18720 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45  e->eFileLock>=RE
18730 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63  SERVED_LOCK && c
18740 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
18750 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
18760 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18770 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18780 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
18790 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
187a0 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20  ( !rc ){ .      
187b0 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
187c0 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  ved = 0; .      
187d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
187e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
187f0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
18800 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
18810 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b  de->nShared>1)){
18820 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
18830 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
18840 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
18850 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
18860 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f  TE_OK && eFileLo
18870 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a  ck==NO_LOCK ){..
18880 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
18890 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
188a0 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
188b0 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
188c0 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
188d0 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
188e0 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
188f0 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
18900 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
18910 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
18920 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65    */.    unsigne
18930 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
18940 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
18950 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
18960 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
18970 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
18980 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
18990 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
189a0 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ){.      Simulat
189b0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
189c0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
189d0 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
189e0 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
189f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18a00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b  );.      if( !sk
18a10 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ipShared ){.    
18a20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
18a30 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18a40 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
18a50 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
18a60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18a70 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
18a80 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
18a90 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18aa0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
18ab0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
18ac0 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
18ad0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
18ae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18af0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
18b00 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
18b10 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
18b20 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
18b30 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
18b40 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
18b50 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
18b60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18b70 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
18b80 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
18b90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18ba0 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
18bb0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
18bc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18bd0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
18be0 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
18bf0 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
18c00 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
18c10 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
18c20 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
18c30 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
18c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
18c50 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
18c60 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
18c70 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
18c80 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e   afpUnlock(id, N
18c90 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69  O_LOCK);.    uni
18ca0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
18cb0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49     if( pFile->pI
18cc0 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70  node && pFile->p
18cd0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
18ce0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
18cf0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
18d00 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
18d10 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
18d20 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
18d30 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
18d40 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
18d50 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
18d60 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
18d70 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
18d80 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
18d90 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  node->aPending. 
18da0 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
18db0 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
18dc0 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
18dd0 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
18de0 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
18df0 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
18e00 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
18e10 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e   }.    releaseIn
18e20 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
18e30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18e40 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
18e50 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20  ontext);.    rc 
18e60 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
18e70 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  id);.    unixLea
18e80 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20  veMutex();.  }. 
18e90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
18ea0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
18eb0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
18ec0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
18ed0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
18ee0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
18ef0 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f  ve is the AFP lo
18f00 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
18f10 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
18f20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
18f30 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
18f40 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
18f50 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
18f60 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
18f70 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
18f80 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20  .  If you don't 
18f90 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61  compile for a ma
18fa0 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69  c, then the "uni
18fb0 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73  x-afp".** VFS is
18fc0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a   not available..
18fd0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18fe0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
18ff0 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
19000 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
19010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19020 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
19030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19070 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
19080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
190d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
190e0 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e  Begin NFS Lockin
190f0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
19100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19110 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  **/..#if defined
19120 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
19130 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
19140 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a  KING_STYLE./*. *
19150 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
19160 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
19170 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
19180 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
19190 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20    eFileLock. ** 
191a0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
191b0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
191c0 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49  _LOCK.. **. ** I
191d0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
191e0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
191f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
19200 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
19210 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73  w. ** the reques
19220 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
19230 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
19240 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a  is a no-op.. */.
19250 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e  static int nfsUn
19260 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
19270 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
19280 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20  Lock){.  return 
19290 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
192a0 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d  eFileLock, 1);.}
192b0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
192c0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
192d0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
192e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
192f0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
19300 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53  above is the NFS
19310 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
19320 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
19330 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
19340 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
19350 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
19360 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
19370 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
19380 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
19390 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  ble.  .**.******
193a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
193b0 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c  End of the NFS l
193c0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
193d0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19430 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
19440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a  **********.*****
19490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d  *********** Non-
194a0 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
194b0 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  file methods ***
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 0a 2a 2a 0a 2a 2a  **********.**.**
194e0 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69   The next divisi
194f0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c  on contains impl
19500 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
19510 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  all methods of t
19520 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  he .** sqlite3_f
19530 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72  ile object other
19540 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   than the lockin
19550 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  g methods.  The 
19560 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f  locking.** metho
19570 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  ds were defined 
19580 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f  in divisions abo
19590 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20  ve (one locking 
195a0 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69  method per.** di
195b0 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20  vision).  Those 
195c0 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65  methods that are
195d0 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
195e0 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20  ocking modes.** 
195f0 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74  are gather toget
19600 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69  her into this di
19610 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  vision..*/../*.*
19620 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
19630 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74  fset passed as t
19640 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19650 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e  nt, then read cn
19660 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f  t .** bytes into
19670 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68   pBuf. Return th
19680 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19690 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
196a0 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79  .**.** NB:  If y
196b0 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ou define USE_PR
196c0 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44  EAD or USE_PREAD
196d0 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  64, then it migh
196e0 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63  t also.** be nec
196f0 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65  essary to define
19700 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74   _XOPEN_SOURCE t
19710 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20  o be 500.  This 
19720 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f  varies from.** o
19730 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f  ne system to ano
19740 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c  ther.  Since SQL
19750 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66  ite does not def
19760 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a  ine USE_PREAD.**
19770 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62 79 20   in any form by 
19780 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
19790 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
197a0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
197b0 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
197c0 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
197d0 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
197e0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
197f0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
19800 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
19810 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
19820 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
19830 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
19840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
19850 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
19860 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
19870 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
19880 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
19890 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  ){.  int got;.  
198a0 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23  int prior = 0;.#
198b0 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
198c0 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
198d0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
198e0 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
198f0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
19900 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72  R_START;.  asser
19910 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31  t( cnt==(cnt&0x1
19920 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
19930 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20  t( id->h>2 );.  
19940 63 6e 74 20 26 3d 20 30 78 31 66 66 66 66 3b 0a  cnt &= 0x1ffff;.
19950 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65    do{.#if define
19960 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20  d(USE_PREAD).   
19970 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69   got = osPread(i
19980 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
19990 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
199a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
199b0 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66  ot = -1 );.#elif
199c0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
199d0 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20  AD64).    got = 
199e0 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  osPread64(id->h,
199f0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
19a00 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
19a10 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
19a20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  -1 );.#else.    
19a30 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
19a40 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
19a50 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
19a60 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19a70 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
19a80 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
19a90 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
19aa0 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
19ab0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
19ac0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
19ad0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
19ae0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  errno);.      }e
19af0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  lse{.        sto
19b00 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69  reLastErrno((uni
19b10 78 46 69 6c 65 2a 29 69 64 2c 20 30 29 3b 0a 20  xFile*)id, 0);. 
19b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
19b30 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
19b40 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69    got = osRead(i
19b50 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
19b60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
19b70 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61   got==cnt ) brea
19b80 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30  k;.    if( got<0
19b90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
19ba0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f  rno==EINTR ){ go
19bb0 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b  t = 1; continue;
19bc0 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d   }.      prior =
19bd0 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   0;.      storeL
19be0 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
19bf0 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b  le*)id,  errno);
19c00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19c10 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
19c20 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
19c30 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
19c40 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
19c50 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
19c60 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
19c70 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
19c80 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
19c90 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
19ca0 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
19cb0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
19cc0 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
19cd0 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
19ce0 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
19cf0 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
19d00 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
19d10 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
19d20 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
19d30 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
19d40 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
19d50 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
19d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
19d70 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
19d80 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
19d90 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
19da0 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
19db0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
19dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19dd0 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
19de0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
19df0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
19e00 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
19e10 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
19e20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
19e30 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
19e40 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
19e50 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
19e60 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
19e70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19e80 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
19e90 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
19ea0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
19eb0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
19ec0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
19ed0 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
19ee0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
19ef0 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
19f00 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
19f10 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
19f20 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
19f30 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
19f40 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
19f50 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
19f60 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
19f70 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
19f80 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
19f90 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
19fa0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
19fb0 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
19fc0 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
19fd0 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
19fe0 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
19ff0 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
1a000 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
1a010 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
1a020 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
1a030 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
1a040 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1a050 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1a060 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
1a070 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
1a080 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
1a090 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1a0a0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1a0b0 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
1a0c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a0d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1a0e0 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
1a0f0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
1a100 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
1a110 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
1a120 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1a130 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43  on))[offset], nC
1a140 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
1a150 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
1a160 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
1a170 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
1a180 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1a190 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
1a1a0 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65  ndif..  got = se
1a1b0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
1a1c0 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1a1d0 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
1a1e0 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
1a1f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1a200 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
1a210 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
1a220 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1a230 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
1a240 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a250 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1a260 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1a270 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 20 20  no(pFile, 0);   
1a280 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
1a290 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
1a2a0 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
1a2b0 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
1a2c0 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
1a2d0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
1a2e0 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
1a2f0 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
1a300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a310 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1a320 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
1a330 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65 6b 20  Attempt to seek 
1a340 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72 69 70  the file-descrip
1a350 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
1a360 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1a370 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20   to.** absolute 
1a380 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74 68 65  offset iOff, the
1a390 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  n attempt to wri
1a3a0 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
1a3b0 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42   data from.** pB
1a3c0 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61 6e 20  uf to it. If an 
1a3d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
1a3e0 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65 74 20  turn -1 and set 
1a3f0 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77  *piErrno. Otherw
1a400 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ise, .** return 
1a410 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65  the actual numbe
1a420 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1a430 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  en (which may be
1a440 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42   less than.** nB
1a450 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uf)..*/.static i
1a460 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  nt seekAndWriteF
1a470 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  d(.  int fd,    
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a490 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
1a4a0 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69 74 65  criptor to write
1a4b0 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66   to */.  i64 iOf
1a4c0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1a4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1a4e0 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
1a4f0 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20   writing at */. 
1a500 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1a510 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1a520 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1a530 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72 20 74  om this buffer t
1a540 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
1a550 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20  int nBuf,       
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
1a580 72 20 70 42 75 66 20 69 6e 20 62 79 74 65 73 20  r pBuf in bytes 
1a590 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72 72 6e  */.  int *piErrn
1a5a0 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
1a5b0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
1a5c0 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65 72 72  or number if err
1a5d0 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a  or occurs */.){.
1a5e0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1a610 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20 63 61  ned by system ca
1a620 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
1a630 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30 78 31   nBuf==(nBuf&0x1
1a640 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
1a650 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 6e 42 75  t( fd>2 );.  nBu
1a660 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20  f &= 0x1ffff;.  
1a670 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69  TIMER_START;..#i
1a680 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1a690 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20  EAD).  do{ rc = 
1a6a0 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28 66 64  (int)osPwrite(fd
1a6b0 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1a6c0 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  ff); }while( rc<
1a6d0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1a6e0 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  R );.#elif defin
1a6f0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
1a700 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29    do{ rc = (int)
1a710 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70  osPwrite64(fd, p
1a720 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1a730 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26  ;}while( rc<0 &&
1a740 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
1a750 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20  #else.  do{.    
1a760 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65  i64 iSeek = lsee
1a770 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b  k(fd, iOff, SEEK
1a780 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
1a790 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65  ateIOError( iSee
1a7a0 6b 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  k-- );..    if( 
1a7b0 69 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20  iSeek!=iOff ){. 
1a7c0 20 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f       if( piErrno
1a7d0 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69   ) *piErrno = (i
1a7e0 53 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f  Seek==-1 ? errno
1a7f0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74   : 0);.      ret
1a800 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
1a810 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66    rc = osWrite(f
1a820 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, pBuf, nBuf);.
1a830 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26    }while( rc<0 &
1a840 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1a850 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45  ;.#endif..  TIME
1a860 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1a870 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1a880 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1a890 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c  ", fd, rc, iOff,
1a8a0 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1a8b0 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26  ;..  if( rc<0 &&
1a8c0 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72   piErrno ) *piEr
1a8d0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72  rno = errno;.  r
1a8e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1a8f0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1a900 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
1a910 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
1a920 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
1a930 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
1a940 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a950 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1a960 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
1a970 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
1a980 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1a990 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1a9a0 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
1a9b0 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1a9c0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1a9d0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1a9e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1a9f0 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
1aa00 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1aa10 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
1aa20 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1aa30 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64    return seekAnd
1aa40 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f  WriteFd(id->h, o
1aa50 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74  ffset, pBuf, cnt
1aa60 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , &id->lastErrno
1aa70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  );.}.../*.** Wri
1aa80 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
1aa90 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
1aaa0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1aab0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
1aac0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
1aad0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
1aae0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1aaf0 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
1ab00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1ab10 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
1ab20 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1ab30 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1ab40 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
1ab50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1ab60 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1ab70 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
1ab80 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
1ab90 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
1aba0 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1abb0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1abc0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1abd0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1abe0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1abf0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1ac00 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1ac10 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1ac20 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1ac30 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1ac40 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1ac50 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
1ac60 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1ac70 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
1ac80 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
1ac90 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
1aca0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
1acb0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1acc0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  TE_DEBUG.  /* If
1acd0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1ace0 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1acf0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1ad00 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1ad10 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1ad20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1ad30 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1ad40 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1ad50 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
1ad60 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1ad70 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
1ad80 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
1ad90 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
1ada0 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
1adb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1adc0 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
1add0 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
1ade0 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
1adf0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1ae00 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
1ae10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
1ae20 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
1ae30 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1ae40 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
1ae50 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
1ae60 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
1ae70 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
1ae80 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
1ae90 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
1aea0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1aeb0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1aec0 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
1aed0 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
1aee0 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
1aef0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1af00 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1af10 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
1af20 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
1af30 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
1af40 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
1af50 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1af60 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1af70 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
1af80 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1af90 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
1afa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1afb0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1afc0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1afd0 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
1afe0 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
1aff0 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
1b000 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1b010 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1b020 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1b030 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1b040 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1b050 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1b060 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1b070 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1b080 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1b090 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1b0a0 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1b0b0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1b0c0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1b0d0 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
1b0e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b0f0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1b100 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1b110 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1b120 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1b130 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1b140 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1b150 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1b160 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
1b170 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1b180 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1b190 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1b1a0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1b1b0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1b1c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
1b1d0 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
1b1e0 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
1b1f0 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
1b200 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
1b210 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
1b220 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
1b230 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
1b240 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
1b250 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
1b260 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b270 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
1b280 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
1b290 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1b2a0 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
1b2b0 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d  =1 ));..  if( am
1b2c0 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
1b2d0 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1b2e0 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1b2f0 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1b300 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1b310 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1b320 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b330 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1b340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b350 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1b360 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e  (pFile, 0); /* n
1b370 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1b380 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
1b390 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1b3a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1b3b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b3c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1b3d0 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
1b3e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
1b3f0 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
1b400 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
1b410 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
1b420 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
1b430 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
1b440 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
1b450 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
1b460 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
1b470 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
1b480 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1b490 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
1b4a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
1b4b0 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
1b4c0 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
1b4d0 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
1b4e0 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
1b4f0 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
1b500 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
1b510 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1b520 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1b530 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1b540 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1b550 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1b560 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1b570 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1b580 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1b590 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1b5a0 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1b5b0 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46  sync or -DHAVE_F
1b5c0 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20  DATASYNC.*/.#if 
1b5d0 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
1b5e0 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41  nc) && !HAVE_FDA
1b5f0 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  TASYNC.# define 
1b600 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1b610 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1b620 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1b630 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1b640 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1b650 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1b660 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1b670 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1b680 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1b690 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1b6a0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1b6b0 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1b6c0 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1b6d0 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1b6e0 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1b6f0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1b700 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1b710 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1b720 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1b730 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
1b740 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
1b750 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
1b760 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
1b770 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
1b780 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
1b790 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
1b7a0 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
1b7b0 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
1b7c0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
1b7d0 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
1b7e0 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
1b7f0 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
1b800 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
1b810 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
1b820 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
1b830 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
1b840 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
1b850 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
1b860 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
1b870 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
1b880 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
1b890 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
1b8a0 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
1b8b0 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
1b8c0 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
1b8d0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
1b8e0 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
1b8f0 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
1b900 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
1b910 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
1b920 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
1b930 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1b940 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
1b950 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
1b960 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
1b970 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
1b980 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
1b990 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
1b9a0 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
1b9b0 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
1b9c0 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
1b9d0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
1b9e0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
1b9f0 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
1ba00 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1ba10 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
1ba20 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
1ba30 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
1ba40 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
1ba50 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
1ba60 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
1ba70 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
1ba80 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
1ba90 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
1baa0 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
1bab0 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
1bac0 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
1bad0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1bae0 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
1baf0 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
1bb00 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
1bb10 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
1bb20 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
1bb30 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
1bb40 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
1bb50 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
1bb60 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
1bb70 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
1bb80 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
1bb90 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
1bba0 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
1bbb0 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
1bbc0 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
1bbd0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
1bbe0 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
1bbf0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
1bc00 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
1bc10 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1bc20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
1bc30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
1bc40 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
1bc50 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
1bc60 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
1bc70 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
1bc80 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
1bc90 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
1bca0 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
1bcb0 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
1bcc0 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
1bcd0 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
1bce0 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
1bcf0 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
1bd00 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
1bd10 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
1bd20 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
1bd30 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
1bd40 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1bd50 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
1bd60 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1bd70 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1bd80 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1bd90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1bda0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1bdb0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1bdc0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1bdd0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1bde0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
1bdf0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1be00 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1be10 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1be20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
1be30 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
1be40 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
1be50 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
1be60 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
1be70 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
1be80 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
1be90 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
1bea0 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
1beb0 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
1bec0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
1bed0 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
1bee0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1bef0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
1bf00 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
1bf10 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1bf20 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
1bf30 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
1bf40 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
1bf50 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
1bf60 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1bf70 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
1bf80 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
1bf90 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
1bfa0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1bfb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bfc0 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
1bfd0 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
1bfe0 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
1bff0 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46   osFcntl(fd, F_F
1c000 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20  ULLFSYNC, 0);.  
1c010 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1c020 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74  1;.  }.  /* If t
1c030 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69  he FULLFSYNC fai
1c040 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  led, fall back t
1c050 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20  o attempting an 
1c060 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74  fsync()..  ** It
1c070 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f   shouldn't be po
1c080 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66  ssible for fullf
1c090 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20  sync to fail on 
1c0a0 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20  the local .  ** 
1c0b0 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20  file system (on 
1c0c0 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65  OSX), so failure
1c0d0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1c0e0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69  FULLFSYNC.  ** i
1c0f0 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66  sn't supported f
1c100 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73  or this file sys
1c110 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74  tem. So, attempt
1c120 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20   an fsync .  ** 
1c130 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67  and (for now) ig
1c140 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61  nore the overhea
1c150 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f  d of a superfluo
1c160 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20  us fcntl call.  
1c170 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65  .  ** It'd be be
1c180 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66  tter to detect f
1c190 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74  ullfsync support
1c1a0 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20   once and avoid 
1c1b0 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20  .  ** the fcntl 
1c1c0 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20  call every time 
1c1d0 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a  sync is called..
1c1e0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20    */.  if( rc ) 
1c1f0 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1c200 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
1c210 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66  _APPLE__).  /* f
1c220 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46  datasync() on HF
1c230 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66  S+ doesn't yet f
1c240 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69  lush the file si
1c250 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64  ze if it changed
1c260 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1c270 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20  so currently we 
1c280 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d  default to the m
1c290 61 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69  acro that redefi
1c2a0 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f  nes fdatasync to
1c2b0 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63   fsync.  */.  rc
1c2c0 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65   = fsync(fd);.#e
1c2d0 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74  lse .  rc = fdat
1c2e0 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f  async(fd);.#if O
1c2f0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
1c300 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d  rc==-1 && errno=
1c310 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20  =ENOTSUP ){.    
1c320 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1c330 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53    }.#endif /* OS
1c340 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64  _VXWORKS */.#end
1c350 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49  if /* ifdef SQLI
1c360 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20  TE_NO_SYNC elif 
1c370 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a  HAVE_FULLFSYNC *
1c380 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f  /..  if( OS_VXWO
1c390 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29  RKS && rc!= -1 )
1c3a0 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
1c3b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c3c0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
1c3d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1c3e0 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
1c3f0 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20  containing file 
1c400 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66  zFilename..** If
1c410 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46   successful, *pF
1c420 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
1c430 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63  opened file desc
1c440 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51  riptor and.** SQ
1c450 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1c460 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
1c470 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20   occurs, either 
1c480 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
1c490 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or SQLITE_CANTOP
1c4a0 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EN is returned a
1c4b0 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  nd *pFd is set t
1c4c0 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a  o an undefined.*
1c4d0 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  * value..**.** T
1c4e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
1c4f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1c500 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e  used for only on
1c510 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20  e thing - to.** 
1c520 66 73 79 6e 63 28 29 20 61 20 64 69 72 65 63 74  fsync() a direct
1c530 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ory to make sure
1c540 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61   file creation a
1c550 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e  nd deletion even
1c560 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65  ts.** are flushe
1c570 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68  d to disk.  Such
1c580 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20   fsyncs are not 
1c590 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a  needed on newer.
1c5a0 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69  ** journaling fi
1c5b0 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61  lesystems, but a
1c5c0 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f  re required on o
1c5d0 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73  lder filesystems
1c5e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c5f0 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72  tine can be over
1c600 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65  ridden using the
1c610 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74   xSetSysCall int
1c620 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61  erface..** The a
1c630 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69  bility to overri
1c640 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  de this routine 
1c650 77 61 73 20 61 64 64 65 64 20 69 6e 20 73 75 70  was added in sup
1c660 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63  port of the.** c
1c670 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e  hromium sandbox.
1c680 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65    Opening a dire
1c690 63 74 6f 72 79 20 69 73 20 61 20 73 65 63 75 72  ctory is a secur
1c6a0 69 74 79 20 72 69 73 6b 20 28 77 65 20 61 72 65  ity risk (we are
1c6b0 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b  .** told) so mak
1c6c0 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65 61  ing it overridea
1c6d0 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ble allows the c
1c6e0 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20  hromium sandbox 
1c6f0 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68  to.** replace th
1c700 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
1c710 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
1c720 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20  .  To make this 
1c730 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d  routine.** a no-
1c740 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77  op, replace it w
1c750 69 74 68 20 61 20 73 74 75 62 20 74 68 61 74 20  ith a stub that 
1c760 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1c770 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20  K but leaves.** 
1c780 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65  *pFd set to a ne
1c790 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a  gative number..*
1c7a0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1c7b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1c7c0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
1c7d0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f  ponsible for clo
1c7e0 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65  sing.** the file
1c7f0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64   descriptor *pFd
1c800 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a   using close()..
1c810 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
1c820 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  enDirectory(cons
1c830 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1c840 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20  e, int *pFd){.  
1c850 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64  int ii;.  int fd
1c860 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44   = -1;.  char zD
1c870 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  irname[MAX_PATHN
1c880 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74  AME+1];..  sqlit
1c890 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
1c8a0 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61  PATHNAME, zDirna
1c8b0 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e  me, "%s", zFilen
1c8c0 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28  ame);.  for(ii=(
1c8d0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e  int)strlen(zDirn
1c8e0 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44  ame); ii>1 && zD
1c8f0 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b  irname[ii]!='/';
1c900 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69   ii--);.  if( ii
1c910 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61  >0 ){.    zDirna
1c920 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  me[ii] = '\0';. 
1c930 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
1c940 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
1c950 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
1c960 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
1c970 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  =0 ){.      OSTR
1c980 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d  ACE(("OPENDIR %-
1c990 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44  3d %s\n", fd, zD
1c9a0 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  irname));.    }.
1c9b0 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
1c9c0 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30  .  return (fd>=0
1c9d0 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c  ?SQLITE_OK:unixL
1c9e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1c9f0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1ca00 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29  pen", zDirname))
1ca10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1ca20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
1ca30 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
1ca40 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
1ca50 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1ca60 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
1ca70 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
1ca80 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
1ca90 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
1caa0 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
1cab0 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
1cac0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
1cad0 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
1cae0 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
1caf0 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
1cb00 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
1cb10 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
1cb20 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
1cb30 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1cb40 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
1cb50 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
1cb60 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
1cb70 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
1cb80 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
1cb90 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
1cba0 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
1cbb0 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
1cbc0 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
1cbd0 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
1cbe0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
1cbf0 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
1cc00 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
1cc10 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
1cc20 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
1cc30 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
1cc40 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
1cc50 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
1cc60 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
1cc70 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1cc80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1cc90 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
1cca0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1ccb0 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
1ccc0 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
1ccd0 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
1cce0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1ccf0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1cd00 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
1cd10 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1cd20 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
1cd30 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
1cd40 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1cd50 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
1cd60 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
1cd70 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
1cd80 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
1cd90 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
1cda0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1cdb0 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
1cdc0 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
1cdd0 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
1cde0 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
1cdf0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
1ce00 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
1ce10 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
1ce20 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
1ce30 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1ce40 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
1ce50 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
1ce60 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
1ce70 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
1ce80 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
1ce90 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
1cea0 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
1ceb0 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
1cec0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1ced0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
1cee0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
1cef0 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
1cf00 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
1cf10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1cf20 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1cf30 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
1cf40 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1cf50 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
1cf60 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
1cf70 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
1cf80 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
1cf90 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1cfa0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
1cfb0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1cfc0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
1cfd0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1cfe0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1cff0 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1d000 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1d010 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1d020 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1d030 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1d040 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1d050 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1d060 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1d070 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1d080 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d  e occurrence.  M
1d090 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1d0a0 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1d0b0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1d0c0 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1d0d0 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1d0e0 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1d0f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1d100 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1d110 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1d120 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1d130 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1d140 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1d150 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1d160 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1d170 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1d180 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1d190 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1d1a0 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1d1b0 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1d1c0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1d1d0 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1d1e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d1f0 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
1d200 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
1d210 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
1d220 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1d230 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
1d240 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
1d250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d260 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
1d270 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1d290 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1d2a0 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e  ~UNIXFILE_DIRSYN
1d2b0 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
1d2c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1d2d0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1d2e0 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1d2f0 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1d300 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1d310 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1d320 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1d330 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1d340 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1d350 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
1d360 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1d370 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1d380 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1d390 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1d3a0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1d3b0 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1d3c0 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1d3d0 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1d3e0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1d3f0 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
1d400 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
1d410 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1d420 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
1d430 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
1d440 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
1d450 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
1d460 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
1d470 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
1d480 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
1d490 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1d4a0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
1d4b0 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
1d4c0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1d4d0 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
1d4e0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1d4f0 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63  Chunk;.  }..  rc
1d500 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63   = robust_ftrunc
1d510 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  ate(pFile->h, nB
1d520 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  yte);.  if( rc )
1d530 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1d540 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
1d550 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  o);.    return u
1d560 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1d570 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1d580 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1d590 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1d5a0 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
1d5b0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1d5c0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1d5d0 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1d5e0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1d5f0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1d600 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67   to.    ** doing
1d610 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1d620 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1d630 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1d640 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20  other than a.   
1d650 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
1d660 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65  ase file) and we
1d670 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
1d680 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
1d690 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65  h,.    ** that e
1d6a0 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74  ffectively updat
1d6b0 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  es the change co
1d6c0 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67  unter.  This mig
1d6d0 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a  ht happen.    **
1d6e0 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20   when restoring 
1d6f0 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  a database using
1d700 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
1d710 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  from a zero-leng
1d720 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65  th.    ** source
1d730 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d740 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1d750 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d  Write && nByte==
1d760 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
1d770 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1d780 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
1d790 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  f..#if SQLITE_MA
1d7a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1d7b0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1d7c0 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61   was just trunca
1d7d0 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d  ted to a size sm
1d7e0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63  aller than the c
1d7f0 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  urrently.    ** 
1d800 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72  mapped region, r
1d810 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1d820 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  ive mapping size
1d830 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65   as well. SQLite
1d840 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   will.    ** use
1d850 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74   read() and writ
1d860 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61  e() to access da
1d870 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70  ta beyond this p
1d880 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e  oint from now on
1d890 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .  .    */.    i
1d8a0 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  f( nByte<pFile->
1d8b0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1d8c0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1d8d0 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d  e = nByte;.    }
1d8e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
1d8f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d900 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
1d910 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
1d920 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
1d930 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
1d940 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1d950 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1d960 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
1d970 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
1d980 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1d990 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1d9a0 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
1d9b0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1d9c0 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d  >h, &buf);.  Sim
1d9d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1d9e0 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  =1 );.  if( rc!=
1d9f0 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  0 ){.    storeLa
1da00 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1da10 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  e*)id, errno);. 
1da20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1da30 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1da40 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1da50 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1da60 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1da70 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1da80 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1da90 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1daa0 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1dab0 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1dac0 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1dad0 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1dae0 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1daf0 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1db00 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1db10 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1db20 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1db30 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1db40 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1db50 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1db60 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1db70 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1db80 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1db90 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1dba0 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1dbb0 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1dbc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dbd0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1dbe0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1dbf0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1dc00 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1dc10 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1dc20 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1dc30 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1dc40 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1dc50 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1dc60 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1dc70 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1dc80 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1dc90 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1dca0 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1dcb0 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1dcc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1dcd0 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1dce0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1dcf0 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1dd00 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1dd10 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65  on.  Enlarge the
1dd20 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79   database to nBy
1dd30 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28  tes in size.** (
1dd40 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68  rounded up to th
1dd50 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a  e next chunk-siz
1dd60 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  e).  If the data
1dd70 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a  base is already.
1dd80 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72  ** nBytes or lar
1dd90 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ger, this routin
1dda0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1ddb0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74  .static int fcnt
1ddc0 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69  lSizeHint(unixFi
1ddd0 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e  le *pFile, i64 n
1dde0 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69  Byte){.  if( pFi
1ddf0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1de00 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1de30 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1de40 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de60 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65   Used to hold re
1de70 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66  turn values of f
1de80 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20  stat() */.   .  
1de90 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
1dea0 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b  ile->h, &buf) ){
1deb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1dec0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1ded0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69  ;.    }..    nSi
1dee0 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69  ze = ((nByte+pFi
1def0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f  le->szChunk-1) /
1df00 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29   pFile->szChunk)
1df10 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1df20 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  k;.    if( nSize
1df30 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a  >(i64)buf.st_siz
1df40 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  e ){..#if define
1df50 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  d(HAVE_POSIX_FAL
1df60 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f  LOCATE) && HAVE_
1df70 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a  POSIX_FALLOCATE.
1df80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
1df90 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c  e below is handl
1dfa0 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
1dfb0 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63  alue of osFalloc
1dfc0 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ate() .      ** 
1dfd0 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78  correctly. posix
1dfe0 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20  _fallocate() is 
1dff0 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75  defined to "retu
1e000 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  rns zero on succ
1e010 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ess, .      ** o
1e020 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65  r an error numbe
1e030 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20  r on  failure". 
1e040 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20  See the manpage 
1e050 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1e060 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20        int err;. 
1e070 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
1e080 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61   err = osFalloca
1e090 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66  te(pFile->h, buf
1e0a0 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d  .st_size, nSize-
1e0b0 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
1e0c0 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d      }while( err=
1e0d0 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
1e0e0 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e  if( err ) return
1e0f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1e100 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ITE;.#else.     
1e110 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f   /* If the OS do
1e120 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69  es not have posi
1e130 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66  x_fallocate(), f
1e140 61 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61 20  ake it. Write a 
1e150 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
1e160 20 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61 73   byte to the las
1e170 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62  t byte in each b
1e180 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73 20  lock that falls 
1e190 65 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20 2a  entirely.      *
1e1a0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  * within the ext
1e1b0 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
1e1c0 65 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64 2c  en, if required,
1e1d0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
1e1e0 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
1e1f0 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20  t (nSize-1), to 
1e200 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  set the size of 
1e210 74 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63 74  the file correct
1e220 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ly..      ** Thi
1e230 73 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20 74  s is a similar t
1e240 65 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61 74  echnique to that
1e250 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 6f   used by glibc o
1e260 6e 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20 20  n systems.      
1e270 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ** that do not h
1e280 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
1e290 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20  cate() call..   
1e2a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1e2b0 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c  nBlk = buf.st_bl
1e2c0 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d  ksize;  /* File-
1e2d0 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a  system block siz
1e2e0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
1e2f0 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20  Write = 0;      
1e300 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e310 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
1e320 6e 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  n by seekAndWrit
1e330 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
1e340 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
1e350 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f         /* Next o
1e360 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74  ffset to write t
1e370 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72 69  o */..      iWri
1e380 74 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69  te = ((buf.st_si
1e390 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29  ze + 2*nBlk - 1)
1e3a0 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20  /nBlk)*nBlk-1;. 
1e3b0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 57 72       assert( iWr
1e3c0 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65  ite>=buf.st_size
1e3d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e3e0 28 20 28 69 57 72 69 74 65 2f 6e 42 6c 6b 29 3d  ( (iWrite/nBlk)=
1e3f0 3d 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 2b 6e  =((buf.st_size+n
1e400 42 6c 6b 2d 31 29 2f 6e 42 6c 6b 29 20 29 3b 0a  Blk-1)/nBlk) );.
1e410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 28        assert( ((
1e420 69 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d  iWrite+1)%nBlk)=
1e430 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
1e440 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74  /*no-op*/; iWrit
1e450 65 3c 6e 53 69 7a 65 3b 20 69 57 72 69 74 65 2b  e<nSize; iWrite+
1e460 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20  =nBlk ){.       
1e470 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e   nWrite = seekAn
1e480 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57  dWrite(pFile, iW
1e490 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20  rite, "", 1);.  
1e4a0 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
1e4b0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
1e4c0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1e4d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e4e0 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  f( nWrite==0 || 
1e4f0 28 6e 53 69 7a 65 25 6e 42 6c 6b 29 20 29 7b 0a  (nSize%nBlk) ){.
1e500 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d          nWrite =
1e510 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
1e520 69 6c 65 2c 20 6e 53 69 7a 65 2d 31 2c 20 22 22  ile, nSize-1, ""
1e530 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1e540 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65  ( nWrite!=1 ) re
1e550 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e560 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d  R_WRITE;.      }
1e570 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1e580 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
1e590 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1e5a0 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  if( pFile->mmapS
1e5b0 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74  izeMax>0 && nByt
1e5c0 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  e>pFile->mmapSiz
1e5d0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
1e5e0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1e5f0 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20  szChunk<=0 ){.  
1e600 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66      if( robust_f
1e610 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1e620 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  h, nByte) ){.   
1e630 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1e640 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1e650 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e660 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1e670 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1e680 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1e690 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1e6a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e6b0 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61  .    rc = unixMa
1e6c0 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79  pfile(pFile, nBy
1e6d0 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  te);.    return 
1e6e0 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
1e6f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e700 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
1e710 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c  *pArg is initial
1e720 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
1e730 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
1e740 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
1e750 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
1e760 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1e770 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
1e780 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1e790 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
1e7a0 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
1e7b0 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
1e7c0 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
1e7d0 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
1e7e0 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
1e7f0 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65  ic void unixMode
1e800 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Bit(unixFile *pF
1e810 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
1e820 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
1e830 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
1e840 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
1e850 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
1e860 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
1e870 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
1e880 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
1e890 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1e8a0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
1e8b0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1e8c0 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
1e8d0 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
1e8e0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
1e8f0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e900 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
1e910 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1e920 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
1e930 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
1e940 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
1e950 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
1e960 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1e970 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1e980 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1e990 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1e9a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1e9b0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1e9c0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1e9d0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1e9e0 45 5f 46 43 4e 54 4c 5f 57 41 4c 5f 42 4c 4f 43  E_FCNTL_WAL_BLOC
1e9f0 4b 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  K: {.      pFile
1ea00 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
1ea10 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 3b 0a 20  NIXFILE_BLOCK;. 
1ea20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ea30 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1ea40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ea50 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1ea60 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1ea70 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  g = pFile->eFile
1ea80 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
1ea90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1eaa0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1eab0 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45  ITE_FCNTL_LAST_E
1eac0 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
1ead0 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
1eae0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
1eaf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1eb00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1eb10 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1eb20 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
1eb30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
1eb40 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
1eb50 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
1eb60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1eb70 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1eb80 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1eb90 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  NT: {.      int 
1eba0 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  rc;.      Simula
1ebb0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1ebc0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  1);.      rc = f
1ebd0 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69  cntlSizeHint(pFi
1ebe0 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67  le, *(i64 *)pArg
1ebf0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1ec00 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1ec10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ec20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  rc;.    }.    ca
1ec30 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ec40 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
1ec50 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1ec60 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1ec70 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69  _PERSIST_WAL, (i
1ec80 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1ec90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1eca0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1ecb0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1ecc0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1ecd0 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  TE: {.      unix
1ece0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1ecf0 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  NIXFILE_PSOW, (i
1ed00 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1ed10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ed20 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1ed30 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
1ed40 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
1ed50 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1ed60 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1ed70 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
1ed80 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
1ed90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1eda0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1edb0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
1edc0 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
1edd0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
1ede0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
1edf0 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d  oc( pFile->pVfs-
1ee00 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
1ee10 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20       if( zTFile 
1ee20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47  ){.        unixG
1ee30 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65  etTempname(pFile
1ee40 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1ee50 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20  me, zTFile);.   
1ee60 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
1ee70 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20  rg = zTFile;.   
1ee80 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1ee90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1eea0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1eeb0 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56  TE_FCNTL_HAS_MOV
1eec0 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  ED: {.      *(in
1eed0 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61  t*)pArg = fileHa
1eee0 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20  sMoved(pFile);. 
1eef0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ef00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
1ef10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1ef20 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65  _SIZE>0.    case
1ef30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
1ef40 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
1ef50 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20   i64 newLimit = 
1ef60 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  *(i64*)pArg;.   
1ef70 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
1ef80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
1ef90 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65   newLimit>sqlite
1efa0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
1efb0 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Mmap ){.        
1efc0 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  newLimit = sqlit
1efd0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1efe0 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20  xMmap;.      }. 
1eff0 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67       *(i64*)pArg
1f000 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69   = pFile->mmapSi
1f010 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28  zeMax;.      if(
1f020 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20   newLimit>=0 && 
1f030 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d  newLimit!=pFile-
1f040 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20  >mmapSizeMax && 
1f050 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74  pFile->nFetchOut
1f060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1f070 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1f080 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  x = newLimit;.  
1f090 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
1f0a0 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20  >mmapSize>0 ){. 
1f0b0 20 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e 6d           unixUnm
1f0c0 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20  apfile(pFile);. 
1f0d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
1f0e0 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  ixMapfile(pFile,
1f0f0 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
1f100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1f110 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
1f120 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1f130 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
1f140 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73   The pager calls
1f150 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20   this method to 
1f160 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68  signal that it h
1f170 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61  as done.    ** a
1f180 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   rollback and th
1f190 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1f1a0 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63  is therefore unc
1f1b0 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a  hanged and.    *
1f1c0 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73  * it hence it is
1f1d0 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e   OK for the tran
1f1e0 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63  saction change c
1f1f0 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20  ounter to be.   
1f200 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   ** unchanged.. 
1f210 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1f220 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1f230 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20  NCHANGED: {.    
1f240 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1f250 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  )->dbUpdate = 0;
1f260 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f270 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1f280 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1f290 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1f2a0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1f2b0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
1f2c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f2d0 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
1f2e0 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1f2f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c  LITE_FCNTL_GET_L
1f300 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
1f310 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f        return pro
1f320 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64  xyFileControl(id
1f330 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d  ,op,pArg);.    }
1f340 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1f350 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1f360 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1f370 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a  d(__APPLE__) */.
1f380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1f390 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
1f3a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f3b0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
1f3c0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
1f3d0 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
1f3e0 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
1f3f0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
1f400 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
1f410 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
1f420 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
1f430 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
1f440 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
1f450 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
1f460 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
1f470 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
1f480 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
1f490 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
1f4a0 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
1f4b0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
1f4c0 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
1f4d0 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
1f4e0 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
1f4f0 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
1f500 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1f510 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
1f520 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
1f530 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54  .#ifndef __QNXNT
1f540 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  O__ .static int 
1f550 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
1f560 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
1f570 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
1f580 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1f590 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
1f5a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1f5b0 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69  OR_SIZE;.}.#endi
1f5c0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1f5d0 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f  lowing version o
1f5e0 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  f unixSectorSize
1f5f0 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  () is optimized 
1f600 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64  for QNX..*/.#ifd
1f610 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69  ef __QNXNTO__.#i
1f620 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64  nclude <sys/dcmd
1f630 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  _blk.h>.#include
1f640 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e   <sys/statvfs.h>
1f650 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1f660 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1f670 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
1f680 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1f690 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1f6a0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65  .  if( pFile->se
1f6b0 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b  ctorSize == 0 ){
1f6c0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1f6d0 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20  vfs fsInfo;.    
1f6e0 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 64     .    /* Set d
1f6f0 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d  efaults for non-
1f700 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73 79  supported filesy
1f710 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69  stems */.    pFi
1f720 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f730 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1f740 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20  SECTOR_SIZE;.   
1f750 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1f760 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20  aracteristics = 
1f770 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61 74  0;.    if( fstat
1f780 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66  vfs(pFile->h, &f
1f790 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b  sInfo) == -1 ) {
1f7a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 46  .      return pF
1f7b0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ile->sectorSize;
1f7c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1f7d0 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
1f7e0 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22  _basetype, "tmp"
1f7f0 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
1f800 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1f810 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
1f820 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1f830 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1f840 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
1f850 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f860 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c  4K |       /* Al
1f870 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  l ram filesystem
1f880 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1f890 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1f8a0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1f8b0 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1f8c0 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1f8d0 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1f8e0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f900 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1f910 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1f920 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1f930 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1f940 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1f950 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1f960 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1f970 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f990 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1f9a0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1f9b0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1f9c0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72  }else if( strstr
1f9d0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
1f9e0 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20  pe, "etfs") ){. 
1f9f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
1fa00 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
1fa10 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
1fa20 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1fa30 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1fa40 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c        /* etfs cl
1fa50 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74 65  uster size write
1fa60 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
1fa70 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e          (pFile->
1fa80 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
1fa90 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
1faa0 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20  ATOMIC512) |.   
1fab0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fac0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
1fad0 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
1fae0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1faf0 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
1fb30 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
1fb40 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fb50 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1fb60 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1fb70 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1fb80 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1fbc0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1fbd0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1fbe0 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
1fbf0 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78  f_basetype, "qnx
1fc00 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  6") ){.      pFi
1fc10 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1fc20 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1fc30 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1fc40 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fc50 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
1fc60 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fc70 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41  C |         /* A
1fc80 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  ll filesystem wr
1fc90 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1fca0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1fcb0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1fcc0 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
1fcd0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
1fce0 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
1fcf0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
1fd20 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
1fd30 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1fd40 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1fd50 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
1fd60 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
1fd70 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
1fd80 0a 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 20 20 20 20 20 20 20                  
1fda0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
1fdb0 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
1fdc0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
1fdd0 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66  se if( !strcmp(f
1fde0 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1fdf0 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20  , "qnx4") ){.   
1fe00 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
1fe10 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
1fe20 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
1fe30 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1fe40 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1fe50 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73      /* full bits
1fe60 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72  et of atomics fr
1fe70 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69  om max sector si
1fe80 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a  ze and smaller *
1fe90 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c  /.        ((pFil
1fea0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1feb0 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1fec0 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c  AP_ATOMIC512) <<
1fed0 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20   1) - 2 |.      
1fee0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1fef0 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
1ff00 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
1ff10 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
1ff20 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
1ff60 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
1ff70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1ff80 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f  strstr(fsInfo.f_
1ff90 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29  basetype, "dos")
1ffa0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1ffb0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1ffc0 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1ffd0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1ffe0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fff0 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
20000 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
20010 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
20020 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
20030 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
20040 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
20050 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
20060 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
20070 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
20080 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
20090 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
200a0 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
200b0 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
200c0 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
200d0 0a 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 20 20 20 20 20 20 20                  
200f0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
20100 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
20110 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
20120 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
20130 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
20140 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
20150 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
20160 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f  OMIC512 |      /
20170 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f  * blocks are ato
20180 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
20190 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
201a0 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
201b0 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
201c0 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
201d0 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
20200 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
20210 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  s */.        0;.
20220 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c      }.  }.  /* L
20230 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69 66  ast chance verif
20240 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  ication.  If the
20250 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e   sector size isn
20260 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  't a multiple of
20270 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69   512.  ** then i
20280 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f  t isn't valid.*/
20290 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65  .  if( pFile->se
202a0 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21  ctorSize % 512 !
202b0 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  = 0 ){.    pFile
202c0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
202d0 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20  ristics = 0;.   
202e0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
202f0 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
20300 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
20310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46  .  }.  return pF
20320 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ile->sectorSize;
20330 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51  .}.#endif /* __Q
20340 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a  NXNTO__ */../*.*
20350 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
20360 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
20370 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
20380 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53  ..**.** This VFS
20390 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65   is set up to re
203a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
203b0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
203c0 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74  WRITE by default
203d0 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68  ..** However, th
203e0 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e  at choice is con
203f0 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65  troversial since
20400 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   technically the
20410 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66   underlying.** f
20420 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ile system does 
20430 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69  not always provi
20440 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65  de powersafe ove
20450 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74  rwrites.  (In ot
20460 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66  her.** words, af
20470 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73  ter a power-loss
20480 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66   event, parts of
20490 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
204a0 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69  ere never.** wri
204b0 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75  tten might end u
204c0 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  p being altered.
204d0 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d  )  However, non-
204e0 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73  PSOW behavior is
204f0 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72   very,.** very r
20500 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74  are.  And assert
20510 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61  ing PSOW makes a
20520 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e   large reduction
20530 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   in the amount.*
20540 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f  * of required I/
20550 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67  O for journaling
20560 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66  , since a lot of
20570 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d   padding is elim
20580 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63  inated..**  Henc
20590 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41  e, while POWERSA
205a0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  FE_OVERWRITE is 
205b0 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  on by default, t
205c0 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63  here is a file-c
205d0 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61  ontrol.** availa
205e0 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
205f0 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79  ff and URI query
20600 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c   parameter avail
20610 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
20620 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
20630 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
20640 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
20650 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
20660 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
20670 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
20680 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66   int rc = 0;.#if
20690 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20  def __QNXNTO__. 
206a0 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53 69   if( p->sectorSi
206b0 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63 74  ze==0 ) unixSect
206c0 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72 63  orSize(id);.  rc
206d0 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61 72   = p->deviceChar
206e0 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65 6e  acteristics;.#en
206f0 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74 72  dif.  if( p->ctr
20700 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
20710 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72 63  E_PSOW ){.    rc
20720 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50   |= SQLITE_IOCAP
20730 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
20740 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RITE;.  }.  retu
20750 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64  rn rc;.}..#if !d
20760 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
20770 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
20780 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
20790 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0../*.** Return 
207a0 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
207b0 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
207c0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
207d0 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64   not be called d
207e0 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72  irectly by other
207f0 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
20800 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  le. .** Instead,
20810 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61   it should be ca
20820 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f  lled via macro o
20830 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a  sGetpagesize()..
20840 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20850 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
20860 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  id){.#if OS_VXWO
20870 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32  RKS.  return 102
20880 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  4;.#elif defined
20890 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20  (_BSD_SOURCE).  
208a0 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69  return getpagesi
208b0 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65  ze();.#else.  re
208c0 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e  turn (int)syscon
208d0 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b  f(_SC_PAGESIZE);
208e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69  .#endif.}..#endi
208f0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
20900 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
20910 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
20920 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66  P_SIZE>0 */..#if
20930 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20940 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  _WAL../*.** Obje
20950 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
20960 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d  sent an shared m
20970 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a  emory buffer.  .
20980 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69  **.** When multi
20990 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
209a0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
209b0 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61  me wal-index, ea
209c0 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73  ch thread.** has
209d0 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d   its own unixShm
209e0 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
209f0 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  y all point to a
20a00 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
20a10 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78  .** of this unix
20a20 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20  ShmNode object. 
20a30 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
20a40 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20   each wal-index 
20a50 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c  is opened.** onl
20a60 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
20a70 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75  ss..**.** Each u
20a80 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20a90 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  t is connected t
20aa0 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49  o a single unixI
20ab0 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
20ac0 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61  .** We could coa
20ad0 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63  lesce this objec
20ae0 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65  t into unixInode
20af0 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77  Info, but that w
20b00 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65  ould mean.** eve
20b10 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61  ry open file tha
20b20 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  t does not use s
20b30 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e  hared memory (in
20b40 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f   other words, mo
20b50 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73  st.** open files
20b60 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  ) would have to 
20b70 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69  carry around thi
20b80 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  s extra informat
20b90 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20  ion.  So.** the 
20ba0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
20bb0 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
20bc0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
20bd0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20be0 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e  ct.** and the un
20bf0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
20c00 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79   is created only
20c10 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a   when needed..**
20c20 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
20c30 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
20c40 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
20c50 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
20c60 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
20c70 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
20c80 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
20c90 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
20ca0 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
20cb0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
20cc0 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
20cd0 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
20ce0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
20cf0 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
20d00 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
20d10 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
20d20 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d  er unixShmNode.m
20d30 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
20d40 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  d or unixShmNode
20d50 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
20d60 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
20d70 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
20d80 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
20d90 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
20da0 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
20db0 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
20dc0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20  unixShmNode {.  
20dd0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
20de0 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e  Inode;     /* un
20df0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74  ixInodeInfo that
20e00 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e   owns this SHM n
20e10 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
20e20 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
20e30 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
20e40 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
20e50 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
20e60 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
20e70 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
20e80 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  e mmapped file *
20e90 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20eb0 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
20ec0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
20ed0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
20ee0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
20ef0 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
20f00 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36  regions */.  u16
20f10 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
20f20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20f30 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
20f40 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64  n */.  u8 isRead
20f50 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  only;           
20f60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
20f70 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72  d-only */.  char
20f80 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20   **apRegion;    
20f90 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
20fa0 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64  of mapped shared
20fb0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
20fc0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
20ff0 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
21000 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
21010 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
21020 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
21030 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
21040 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
21050 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20   this */.#ifdef 
21060 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
21070 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  8 exclMask;     
21080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
21090 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
210a0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
210b0 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  8 sharedMask;   
210c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
210d0 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
210e0 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e  s held */.  u8 n
210f0 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
21100 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
21110 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d  vailable unixShm
21120 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
21130 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  dif.};../*.** St
21140 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
21150 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
21160 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
21170 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
21180 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
21190 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
211a0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
211b0 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
211c0 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
211d0 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
211e0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
211f0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
21200 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
21210 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a   unixShm.pFile.*
21220 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a  *    unixShm.id.
21230 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
21240 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
21250 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78  write.  The unix
21260 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78  Shm.pFile->mutex
21270 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
21280 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
21290 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
212a0 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
212b0 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e  t unixShm {.  un
212c0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
212d0 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ode;     /* The 
212e0 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53  underlying unixS
212f0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
21300 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78  .  unixShm *pNex
21310 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
21320 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69   Next unixShm wi
21330 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78  th the same unix
21340 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
21350 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
21360 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21370 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
21380 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  nixShmNode mutex
21390 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213b0 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
213c0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
213d0 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
213e0 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
213f0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
21400 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
21410 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
21420 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21440 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
21450 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
21460 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
21470 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
21480 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
21490 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
214a0 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
214b0 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
214c0 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
214d0 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
214e0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
214f0 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
21500 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
21510 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
21520 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
21530 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
21540 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
21550 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
21560 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
21570 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
21580 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
21590 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
215a0 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
215b0 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
215c0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
215d0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
215e0 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
215f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
21600 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
21610 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57  nection to the W
21620 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  AL file */.  int
21630 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
21640 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
21650 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
21660 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
21670 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
21680 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
21690 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
216a0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
216c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
216d0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
216e0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
216f0 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c  ShmNode; /* Appl
21700 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
21710 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
21720 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
21730 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
21740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
21750 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
21760 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
21770 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
21780 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
21790 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
217a0 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
217b0 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
217c0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
217d0 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
217e0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
217f0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69    pShmNode = pFi
21800 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
21810 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
21820 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21830 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
21840 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ex) || pShmNode-
21850 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
21860 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
21870 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
21880 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
21890 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
218a0 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
218b0 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
218c0 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
218d0 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
218e0 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54   n>=1 && n<SQLIT
218f0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a  E_SHM_NLOCK );..
21900 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
21910 68 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h>=0 ){.    int 
21920 6c 6b 54 79 70 65 3b 0a 20 20 20 20 2f 2a 20 49  lkType;.    /* I
21930 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
21940 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
21950 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
21960 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29  f, 0, sizeof(f))
21970 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d  ;.    f.l_type =
21980 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66   lockType;.    f
21990 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
219a0 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74  _SET;.    f.l_st
219b0 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20  art = ofst;.    
219c0 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20  f.l_len = n;..  
219d0 20 20 6c 6b 54 79 70 65 20 3d 20 28 70 46 69 6c    lkType = (pFil
219e0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
219f0 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 29 21 3d  NIXFILE_BLOCK)!=
21a00 30 20 3f 20 46 5f 53 45 54 4c 4b 57 20 3a 20 46  0 ? F_SETLKW : F
21a10 5f 53 45 54 4c 4b 3b 0a 20 20 20 20 72 63 20 3d  _SETLK;.    rc =
21a20 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64   osFcntl(pShmNod
21a30 65 2d 3e 68 2c 20 6c 6b 54 79 70 65 2c 20 26 66  e->h, lkType, &f
21a40 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21  );.    rc = (rc!
21a50 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f  =(-1)) ? SQLITE_
21a60 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  OK : SQLITE_BUSY
21a70 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  ;.    pFile->ctr
21a80 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46  lFlags &= ~UNIXF
21a90 49 4c 45 5f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  ILE_BLOCK;.  }..
21aa0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
21ab0 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
21ac0 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
21ad0 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
21ae0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
21af0 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
21b00 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
21b10 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f   "));.  mask = o
21b20 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20  fst>31 ? 0xffff 
21b30 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  : (1<<(ofst+n)) 
21b40 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
21b50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21b60 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
21b70 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
21b80 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21b90 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
21ba0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
21bb0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
21bc0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
21bd0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
21be0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
21bf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
21c00 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
21c10 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
21c20 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
21c30 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
21c40 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
21c50 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
21c60 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21c70 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
21c80 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
21c90 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
21ca0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
21cb0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21cc0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
21cd0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
21ce0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
21cf0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
21d00 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
21d10 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
21d20 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
21d30 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
21d40 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
21d50 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21d60 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
21d70 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
21d80 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
21d90 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
21da0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
21db0 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
21dc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21dd0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
21de0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
21df0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21e00 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
21e10 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
21e20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
21e30 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
21e40 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
21e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
21e60 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
21e70 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
21e80 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
21e90 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
21ea0 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  ;        .}../*.
21eb0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69  ** Return the mi
21ec0 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
21ed0 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73  32KB shm regions
21ee0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
21ef0 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74  mapped at.** a t
21f00 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ime, assuming th
21f10 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  at each mapping 
21f20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67  must be an integ
21f30 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
21f40 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79  he.** current sy
21f50 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a  stem page-size..
21f60 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74  **.** Usually, t
21f70 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78  his is 1. The ex
21f80 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f  ception seems to
21f90 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74   be systems that
21fa0 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a   are configured.
21fb0 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70  ** to use 64KB p
21fc0 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63  ages - in this c
21fd0 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67  ase each mapping
21fe0 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c   must cover at l
21ff0 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20  east two.** shm 
22000 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  regions..*/.stat
22010 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65  ic int unixShmRe
22020 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29  gionPerMap(void)
22030 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20  {.  int shmsz = 
22040 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20  32*1024;        
22050 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f      /* SHM regio
22060 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  n size */.  int 
22070 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65  pgsz = osGetpage
22080 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73  size();   /* Sys
22090 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tem page size */
220a0 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73  .  assert( ((pgs
220b0 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b  z-1)&pgsz)==0 );
220c0 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
220d0 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
220e0 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67  of 2 */.  if( pg
220f0 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72  sz<shmsz ) retur
22100 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67  n 1;.  return pg
22110 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a  sz/shmsz;.}../*.
22120 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
22130 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  xShmNodeList lis
22140 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
22150 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64   with unixShmNod
22160 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
22170 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
22180 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
22190 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
221a0 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
221b0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
221c0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
221d0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
221e0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
221f0 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a  Purge(unixFile *
22200 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  pFd){.  unixShmN
22210 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49  ode *p = pFd->pI
22220 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
22230 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
22240 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
22250 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d  f( p && p->nRef=
22260 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  =0 ){.    int nS
22270 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53  hmPerMap = unixS
22280 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29  hmRegionPerMap()
22290 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
222a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f   assert( p->pIno
222b0 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20  de==pFd->pInode 
222c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
222d0 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
222e0 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ex);.    for(i=0
222f0 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
22300 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a  i+=nShmPerMap){.
22310 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d        if( p->h>=
22320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d  0 ){.        osM
22330 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f  unmap(p->apRegio
22340 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f  n[i], p->szRegio
22350 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
22360 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22370 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
22380 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
22390 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
223a0 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
223b0 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68  n);.    if( p->h
223c0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  >=0 ){.      rob
223d0 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70  ust_close(pFd, p
223e0 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
223f0 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b        p->h = -1;
22400 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
22410 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
22420 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
22430 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
22440 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
22450 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
22460 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22470 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
22480 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
22490 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
224a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
224b0 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
224c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
224d0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
224e0 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
224f0 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
22500 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
22510 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
22520 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
22530 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
22540 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
22550 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
22560 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
22570 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
22580 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
22590 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
225a0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
225b0 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
225c0 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
225d0 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
225e0 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
225f0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
22600 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
22610 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
22620 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
22630 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
22640 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
22650 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
22660 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
22670 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
22680 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
22690 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
226a0 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
226b0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
226c0 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
226d0 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
226e0 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
226f0 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
22700 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
22710 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
22720 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
22730 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
22740 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
22750 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
22760 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
22770 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
22780 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
22790 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
227a0 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
227b0 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
227c0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
227d0 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
227e0 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
227f0 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
22800 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
22810 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
22820 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
22830 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
22840 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
22850 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
22860 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
22870 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
22880 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
22890 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
228a0 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
228b0 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
228c0 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
228d0 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
228e0 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
228f0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
22900 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
22910 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
22920 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
22930 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
22940 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
22950 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
22960 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
22970 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
22980 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
22990 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
229a0 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
229b0 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
229c0 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
229d0 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
229e0 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
229f0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
22a00 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
22a10 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
22a20 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
22a30 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
22a40 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
22a50 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
22a60 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
22a70 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
22a80 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
22a90 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
22aa0 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
22ab0 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
22ac0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
22ad0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22ae0 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
22af0 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
22b00 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
22b10 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
22b20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
22b30 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
22b40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
22b50 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
22b60 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
22b70 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
22b80 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
22b90 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
22ba0 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
22bb0 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
22bc0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
22bd0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
22be0 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
22bf0 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
22c00 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
22c10 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
22c20 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
22c30 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
22c40 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
22c50 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
22c60 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
22c70 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
22c80 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
22c90 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
22ca0 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
22cb0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
22cc0 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
22cd0 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
22ce0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
22d10 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
22d20 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
22d30 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
22d40 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
22d50 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
22d60 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
22d70 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
22d80 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
22d90 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
22da0 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
22db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
22dc0 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
22dd0 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
22de0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
22df0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
22e00 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
22e10 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
22e20 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
22e30 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
22e40 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
22e50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
22e60 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
22e70 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
22e80 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
22e90 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
22ea0 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
22eb0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
22ec0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
22ed0 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
22ee0 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
22ef0 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
22f00 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
22f10 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
22f20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
22f30 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
22f40 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
22f50 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
22f60 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
22f70 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
22f80 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
22f90 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
22fa0 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
22fb0 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
22fc0 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66   file */.#ifndef
22fd0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22fe0 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20  CTORY.    const 
22ff0 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20  char *zBasePath 
23000 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a  = pDbFd->zPath;.
23010 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
23020 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
23030 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
23040 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
23050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
23060 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
23070 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
23080 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
23090 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
230a0 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
230b0 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
230c0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
230d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
230e0 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
230f0 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
23100 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
23110 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
23120 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
23130 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
23140 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
23150 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
23160 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
23170 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
23180 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
23190 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
231a0 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
231b0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
231c0 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   + (int)strlen(z
231d0 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69  BasePath);.#endi
231e0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
231f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
23200 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
23210 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  e) + nShmFilenam
23220 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  e );.    if( pSh
23230 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
23240 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
23250 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
23260 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
23270 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
23280 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  ShmNode, 0, size
23290 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53  of(*pShmNode)+nS
232a0 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
232b0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   zShmFilename = 
232c0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
232d0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53  ame = (char*)&pS
232e0 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65  hmNode[1];.#ifde
232f0 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
23300 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74  ECTORY.    sqlit
23310 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
23320 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
23330 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  lename, .       
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
23350 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
23360 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d  RY "/sqlite-shm-
23370 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20  %x-%x",.        
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
23390 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20  2)sStat.st_ino, 
233a0 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65  (u32)sStat.st_de
233b0 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71  v);.#else.    sq
233c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
233d0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
233e0 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  mFilename, "%s-s
233f0 68 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29 3b  hm", zBasePath);
23400 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
23410 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a  Suffix3(pDbFd->z
23420 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  Path, zShmFilena
23430 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  me);.#endif.    
23440 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31  pShmNode->h = -1
23450 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e  ;.    pDbFd->pIn
23460 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
23470 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53  pShmNode;.    pS
23480 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d  hmNode->pInode =
23490 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
234a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
234b0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
234c0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
234d0 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
234e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
234f0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
23500 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
23510 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
23520 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
23530 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e    }..    if( pIn
23540 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
23550 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  k==0 ){.      in
23560 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  t openFlags = O_
23570 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
23580 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
23590 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44  3_uri_boolean(pD
235a0 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61  bFd->zPath, "rea
235b0 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29  donly_shm", 0) )
235c0 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c  {.        openFl
235d0 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  ags = O_RDONLY;.
235e0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
235f0 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31  ->isReadonly = 1
23600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23610 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f  pShmNode->h = ro
23620 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69  bust_open(zShmFi
23630 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  lename, openFlag
23640 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64  s, (sStat.st_mod
23650 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20  e&0777));.      
23660 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  if( pShmNode->h<
23670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
23680 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
23690 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
236a0 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68  KPT, "open", zSh
236b0 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
236c0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
236d0 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a  n_err;.      }..
236e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
236f0 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e   process is runn
23700 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b  ing as root, mak
23710 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
23720 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  SHM file.      *
23730 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68  * is owned by th
23740 65 20 73 61 6d 65 20 75 73 65 72 20 74 68 61 74  e same user that
23750 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e   owns the origin
23760 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74  al database.  Ot
23770 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
23780 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  * the original o
23790 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65  wner will not be
237a0 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74   able to connect
237b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
237c0 20 6f 73 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f   osFchown(pShmNo
237d0 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f  de->h, sStat.st_
237e0 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69  uid, sStat.st_gi
237f0 64 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  d);.  .      /* 
23800 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23810 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
23820 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
23830 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
23840 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c        ** If not,
23850 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
23860 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
23870 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  h. .      */.   
23880 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23890 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  K;.      if( uni
238a0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
238b0 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55  DbFd, F_WRLCK, U
238c0 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  NIX_SHM_DMS, 1)=
238d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
238e0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
238f0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
23900 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
23910 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
23920 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
23930 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
23940 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68  "ftruncate", zSh
23950 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
23960 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23970 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23990 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
239a0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
239b0 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _RDLCK, UNIX_SHM
239c0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
239d0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
239e0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
239f0 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rr;.    }.  }.. 
23a00 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
23a10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
23a20 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53  ild of the unixS
23a30 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
23a40 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
23a50 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
23a60 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
23a70 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
23a80 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
23a90 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
23aa0 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
23ab0 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61  m = p;.  unixLea
23ac0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
23ad0 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
23ae0 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
23af0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
23b00 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
23b10 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
23b20 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e  er of the unixEn
23b30 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78  terMutex() mutex
23b40 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72   and the pointer
23b50 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e   from the.  ** n
23b60 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53  ew (struct unixS
23b70 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
23b80 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
23b90 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
23ba0 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
23bb0 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
23bc0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
23bd0 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
23be0 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
23bf0 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
23c00 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
23c10 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
23c20 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
23c30 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a  ode->mutex .  **
23c40 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
23c50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23c60 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23c70 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
23c80 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
23c90 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
23ca0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
23cb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
23cc0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
23cd0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
23ce0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
23cf0 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
23d00 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
23d10 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50  _err:.  unixShmP
23d20 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20  urge(pDbFd);    
23d30 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
23d40 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
23d50 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
23d60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
23d70 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
23d80 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
23d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
23da0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
23db0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
23dc0 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
23dd0 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
23de0 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
23df0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
23e00 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
23e10 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
23e20 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
23e30 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
23e40 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
23e50 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
23e60 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
23e70 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
23e80 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
23e90 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
23ea0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
23eb0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
23ec0 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
23ed0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
23ee0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
23ef0 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65  bExtend paramete
23f00 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
23f10 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
23f20 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
23f30 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
23f40 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
23f50 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
23f60 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
23f70 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
23f80 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
23f90 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
23fa0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
23fb0 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
23fc0 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a  bExtend is non-z
23fd0 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
23fe0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
23ff0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
24000 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
24010 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
24020 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
24030 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
24040 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
24050 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
24060 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
24070 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
24080 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
24090 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
240a0 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
240b0 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
240c0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
240d0 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
240e0 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
240f0 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
24100 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
24110 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
24120 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
24130 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24140 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24150 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73   unixShmMap(.  s
24160 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
24170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24180 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
24190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
241a0 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
241d0 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
241e0 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24200 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
24210 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65  s */.  int bExte
24220 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
24230 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
24240 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
24250 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
24260 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
24270 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
24280 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
24290 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e  emory */.){.  un
242a0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
242b0 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
242c0 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75   unixShm *p;.  u
242d0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
242e0 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
242f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
24300 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
24310 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
24320 61 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71  ap();.  int nReq
24330 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66  Region;..  /* If
24340 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
24350 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
24360 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
24370 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
24380 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
24390 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
243a0 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
243b0 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
243c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
243d0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
243e0 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
243f0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
24400 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
24410 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
24420 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
24430 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
24440 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
24450 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
24460 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
24470 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
24480 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
24490 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
244a0 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
244b0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
244c0 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
244d0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
244e0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
244f0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
24500 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
24510 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
24520 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69  =0 );..  /* Mini
24530 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
24540 67 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74  gions required t
24550 6f 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a  o be mapped. */.
24560 20 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28    nReqRegion = (
24570 28 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72  (iRegion+nShmPer
24580 4d 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61  Map) / nShmPerMa
24590 70 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b  p) * nShmPerMap;
245a0 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
245b0 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65  ->nRegion<nReqRe
245c0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
245d0 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245f0 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
24600 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
24610 74 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65  t nByte = nReqRe
24620 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  gion*szRegion;  
24630 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
24640 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
24650 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
24660 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
24670 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
24680 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
24690 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
246a0 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
246b0 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
246c0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
246d0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
246e0 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
246f0 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
24700 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
24710 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
24720 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
24730 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
24740 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
24750 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
24760 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
24770 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
24780 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
24790 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
247a0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
247b0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
247c0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
247d0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
247e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
247f0 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
24800 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24810 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
24820 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
24830 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
24840 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
24850 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
24860 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
24870 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
24880 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
24890 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
248a0 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
248b0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
248c0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
248d0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
248e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
248f0 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20  !bExtend ){.    
24900 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
24910 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
24920 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
24930 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
24940 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
24950 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
24960 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20  . Do this by.   
24970 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20       ** writing 
24980 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
24990 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
249a0 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67   (OS) page being
249b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
249c0 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
249d0 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  d. Technically, 
249e0 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69  we need only wri
249f0 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  te to the.      
24a00 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69    ** last page i
24a10 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e  n order to exten
24a20 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20  d the file. But 
24a30 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e  writing to all n
24a40 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ew.        ** pa
24a50 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f  ges forces the O
24a60 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  S to allocate th
24a70 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  em immediately, 
24a80 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20  which reduces.  
24a90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61        ** the cha
24aa0 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77  nces of SIGBUS w
24ab0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74  hile accessing t
24ac0 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
24ad0 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20   later on..     
24ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c     */.        el
24af0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
24b00 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70  atic const int p
24b10 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  gsz = 4096;.    
24b20 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a        int iPg;..
24b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24b40 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
24b50 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c  yte of each newl
24b60 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  y allocated or e
24b70 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a  xtended page */.
24b80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24b90 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29  ( (nByte % pgsz)
24ba0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
24bb0 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e   for(iPg=(sStat.
24bc0 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69  st_size/pgsz); i
24bd0 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b  Pg<(nByte/pgsz);
24be0 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
24bf0 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
24c00 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
24c10 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
24c20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 30  pgsz-1, "", 1, 0
24c30 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
24c40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
24c50 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f   *zFile = pShmNo
24c60 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  de->zFilename;. 
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
24c80 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
24c90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
24ca0 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46  IZE, "write", zF
24cb0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
24cc0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
24cd0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
24ce0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
24cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24d00 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
24d10 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
24d20 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
24d30 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
24d40 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
24d50 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
24d60 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  = (char **)sqlit
24d70 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
24d80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
24d90 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69  Region, nReqRegi
24da0 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a  on*sizeof(char *
24db0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
24dc0 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
24dd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
24de0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
24df0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
24e10 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d  Node->apRegion =
24e20 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c   apNew;.    whil
24e30 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  e( pShmNode->nRe
24e40 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20  gion<nReqRegion 
24e50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 61  ){.      int nMa
24e60 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68  p = szRegion*nSh
24e70 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20 69  mPerMap;.      i
24e80 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69 64  nt i;.      void
24e90 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66   *pMem;.      if
24ea0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
24eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
24ec0 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61   = osMmap(0, nMa
24ed0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  p,.            p
24ee0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
24ef0 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20  nly ? PROT_READ 
24f00 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54  : PROT_READ|PROT
24f10 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20  _WRITE, .       
24f20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c       MAP_SHARED,
24f30 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a   pShmNode->h, sz
24f40 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d  Region*(i64)pShm
24f50 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20  Node->nRegion.  
24f60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
24f70 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46   if( pMem==MAP_F
24f80 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
24f90 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
24fa0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
24fb0 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22  R_SHMMAP, "mmap"
24fc0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  , pShmNode->zFil
24fd0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
24fe0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
24ff0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
25000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25010 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65     pMem = sqlite
25020 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f  3_malloc(szRegio
25030 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
25040 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pMem==0 ){.     
25050 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25060 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
25070 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
25080 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
25090 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65        memset(pMe
250a0 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b  m, 0, szRegion);
250b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
250c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50  for(i=0; i<nShmP
250d0 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  erMap; i++){.   
250e0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
250f0 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  pRegion[pShmNode
25100 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26  ->nRegion+i] = &
25110 28 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a  ((char*)pMem)[sz
25120 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20  Region*i];.     
25130 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
25140 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53  e->nRegion += nS
25150 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a  hmPerMap;.    }.
25160 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
25170 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
25180 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
25190 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
251a0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
251b0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
251c0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
251d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
251e0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
251f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
25200 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
25210 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69  READONLY;.  sqli
25220 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
25230 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
25240 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25250 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
25260 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
25270 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
25280 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
25290 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
252a0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
252b0 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
252c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
252d0 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
252e0 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
252f0 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
25300 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
25310 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
25320 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
25330 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
25340 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
25350 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
25360 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
25370 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
25380 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
25390 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
253a0 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
253b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
253c0 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
253d0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
253e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
253f0 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
25400 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
25410 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
25420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25430 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
25440 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
25450 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
25460 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
25470 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25480 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
25490 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
254a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
254d0 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
254e0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
254f0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
25500 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
25510 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
25520 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
25530 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
25540 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
25550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25560 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
25570 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
25580 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
255b0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
255c0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
255d0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
255e0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
255f0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
25600 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
25610 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
25620 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
25630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
25640 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
25650 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25670 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
25680 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
25690 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
256a0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
256b0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
256c0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
256d0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
256e0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
256f0 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
25700 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
25710 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
25720 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
25730 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
25740 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
25750 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
25760 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
25770 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
25780 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
25790 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
257a0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
257b0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
257c0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
257d0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
257e0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
257f0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
25800 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
25810 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
25820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
25830 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
25840 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
25850 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
25860 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
25870 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
25880 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
25890 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
258a0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
258b0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
258c0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
258d0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
258e0 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
258f0 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
25900 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
25910 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
25920 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
25930 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
25940 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
25950 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
25960 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
25970 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
25980 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
25990 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
259a0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
259b0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
259c0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
259d0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
259e0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
259f0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
25a00 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
25a10 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
25a20 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
25a30 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
25a40 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
25a50 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
25a60 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
25a70 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
25a80 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
25a90 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
25aa0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
25ab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
25ac0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
25ad0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
25ae0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
25af0 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20  pDbFd, F_UNLCK, 
25b00 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
25b10 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
25b20 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
25b30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
25b40 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
25b50 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
25b60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
25b80 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
25b90 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
25ba0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
25bb0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
25bc0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
25bd0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
25be0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
25bf0 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
25c00 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
25c10 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
25c20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
25c30 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
25c40 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
25c50 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
25c60 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
25c70 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
25c80 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
25c90 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
25ca0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
25cb0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
25cc0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
25cd0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
25ce0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
25cf0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
25d00 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
25d10 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
25d20 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
25d30 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
25d40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
25d50 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
25d60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25d70 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
25d80 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
25d90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
25da0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
25db0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
25dc0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
25dd0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
25de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25df0 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
25e00 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
25e10 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
25e20 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
25e30 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66  bFd, F_RDLCK, of
25e40 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
25e50 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
25e60 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
25e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
25e80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25e90 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
25ea0 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
25eb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25ec0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
25ed0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
25ee0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
25ef0 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
25f00 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
25f10 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
25f20 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
25f30 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
25f40 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
25f50 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
25f60 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
25f70 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
25f80 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
25f90 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
25fa0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
25fb0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
25fc0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
25fd0 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
25fe0 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
25ff0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26000 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
26010 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26020 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
26030 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
26040 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
26050 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
26060 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
26070 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
26080 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
26090 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
260a0 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
260b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
260c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
260d0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
260e0 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52  Lock(pDbFd, F_WR
260f0 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
26100 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
26110 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26130 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
26140 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
26150 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
26160 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
26170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26180 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
26190 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
261a0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
261b0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
261c0 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
261d0 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
261e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
261f0 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69 64 28 29  ->id, osGetpid()
26200 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
26210 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a   p->exclMask));.
26220 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26230 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
26240 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
26250 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
26260 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
26270 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
26280 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
26290 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
262a0 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
262b0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
262c0 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
262d0 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
262e0 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
262f0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
26300 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
26310 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26330 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
26340 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
26350 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
26360 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26370 28 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  (fd);.  unixEnte
26380 72 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78  rMutex();.  unix
26390 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
263a0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
263b0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
263c0 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
263d0 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
263e0 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
263f0 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
26400 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
26410 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65  here is no share
26420 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
26430 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ted with the con
26440 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69  nection then thi
26450 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
26460 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
26470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26480 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20  unixShmUnmap(.  
26490 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
264a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
264b0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
264c0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
264d0 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
264e0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
264f0 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73       /* Delete s
26500 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20  hared-memory if 
26510 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  true */.){.  uni
26520 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  xShm *p;        
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26540 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
26550 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
26560 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
26570 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
26580 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
26590 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
265a0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
265b0 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
265c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
265d0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
265e0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
265f0 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ns */.  unixFile
26600 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20   *pDbFd;        
26610 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
26620 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
26630 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44  se file */..  pD
26640 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
26650 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
26660 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
26670 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
26680 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
26690 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
266a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
266b0 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
266c0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
266d0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
266e0 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
266f0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20  Fd->pInode );.. 
26700 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
26710 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
26720 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
26730 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
26740 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
26750 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
26760 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
26770 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
26780 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
26790 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
267a0 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
267b0 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
267c0 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
267d0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
267e0 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
267f0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
26800 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
26810 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
26820 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
26830 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
26840 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
26850 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
26860 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
26870 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
26880 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
26890 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45  , too */.  unixE
268a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
268b0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
268c0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68  >nRef>0 );.  pSh
268d0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  mNode->nRef--;. 
268e0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
268f0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref==0 ){.    if
26900 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20  ( deleteFlag && 
26910 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
26920 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  {.      osUnlink
26930 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
26940 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
26950 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
26960 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
26970 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
26980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26990 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
269a0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
269b0 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
269c0 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
269d0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
269e0 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
269f0 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
26a00 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
26a10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26a20 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53  IT_WAL */..#if S
26a30 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
26a40 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69  IZE>0./*.** If i
26a50 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d  t is currently m
26a60 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e  emory mapped, un
26a70 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f  map file pFd..*/
26a80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
26a90 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
26aa0 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73  ile *pFd){.  ass
26ab0 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
26ac0 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Out==0 );.  if( 
26ad0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
26ae0 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  ){.    osMunmap(
26af0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  pFd->pMapRegion,
26b00 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
26b10 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e  tual);.    pFd->
26b20 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
26b30 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
26b40 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e  e = 0;.    pFd->
26b50 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
26b60 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
26b70 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
26b80 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
26b90 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d  memory mapping m
26ba0 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c  aintained by fil
26bb0 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  e .** descriptor
26bc0 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74   pFd to nNew byt
26bd0 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67  es. Any existing
26be0 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73 63   mapping is disc
26bf0 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arded..**.** If 
26c00 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
26c10 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
26c20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
26c30 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  iables:.**.**   
26c40 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61      unixFile.pMa
26c50 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  pRegion.**      
26c60 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
26c70 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  ze.**       unix
26c80 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74  File.mmapSizeAct
26c90 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73  ual.**.** If uns
26ca0 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72  uccessful, an er
26cb0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
26cc0 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69 74 65  ogged via sqlite
26cd0 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74  3_log() and.** t
26ce0 68 65 20 74 68 72 65 65 20 76 61 72 69 61 62 6c  he three variabl
26cf0 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72  es above are zer
26d00 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  oed. In this cas
26d10 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a  e SQLite should.
26d20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65  ** continue acce
26d30 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
26d40 73 65 20 75 73 69 6e 67 20 74 68 65 20 78 52 65  se using the xRe
26d50 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65 28  ad() and xWrite(
26d60 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  ).** methods..*/
26d70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
26d80 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e  xRemapfile(.  un
26d90 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20  ixFile *pFd,    
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26db0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
26dc0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34   object */.  i64
26dd0 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20 20   nNew           
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26df0 52 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67  Required mapping
26e00 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f   size */.){.  co
26e10 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
26e20 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68   "mmap";.  int h
26e30 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20   = pFd->h;      
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e50 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
26e60 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69  or open on db fi
26e70 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69  le */.  u8 *pOri
26e80 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70  g = (u8 *)pFd->p
26e90 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20  MapRegion;   /* 
26ea0 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
26eb0 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20  nt file mapping 
26ec0 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d  */.  i64 nOrig =
26ed0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
26ee0 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a  tual;     /* Siz
26ef0 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f  e of pOrig regio
26f00 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
26f10 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20  u8 *pNew = 0;   
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f30 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e       /* Location
26f40 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20   of new mapping 
26f50 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  */.  int flags =
26f60 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20   PROT_READ;     
26f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
26f80 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d  gs to pass to mm
26f90 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ap() */..  asser
26fa0 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
26fb0 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
26fc0 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70  ( nNew>pFd->mmap
26fd0 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
26fe0 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61  ( nNew<=pFd->mma
26ff0 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73  pSizeMax );.  as
27000 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
27010 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d    assert( pFd->m
27020 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70  mapSizeActual>=p
27030 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a  Fd->mmapSize );.
27040 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41    assert( MAP_FA
27050 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66  ILED!=0 );..  if
27060 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
27070 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
27080 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20  NLY)==0 ) flags 
27090 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a  |= PROT_WRITE;..
270a0 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23    if( pOrig ){.#
270b0 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
270c0 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20     i64 nReuse = 
270d0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23  pFd->mmapSize;.#
270e0 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
270f0 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f  nt szSyspage = o
27100 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a  sGetpagesize();.
27110 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d      i64 nReuse =
27120 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20   (pFd->mmapSize 
27130 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29  & ~(szSyspage-1)
27140 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38  );.#endif.    u8
27150 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b   *pReq = &pOrig[
27160 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a  nReuse];..    /*
27170 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73   Unmap any pages
27180 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67   of the existing
27190 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63 61   mapping that ca
271a0 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20  nnot be reused. 
271b0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73  */.    if( nReus
271c0 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  e!=nOrig ){.    
271d0 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c    osMunmap(pReq,
271e0 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a   nOrig-nReuse);.
271f0 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f      }..#if HAVE_
27200 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20  MREMAP.    pNew 
27210 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67  = osMremap(pOrig
27220 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20  , nReuse, nNew, 
27230 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b  MREMAP_MAYMOVE);
27240 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65  .    zErr = "mre
27250 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20  map";.#else.    
27260 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52  pNew = osMmap(pR
27270 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c  eq, nNew-nReuse,
27280 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52   flags, MAP_SHAR
27290 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a  ED, h, nReuse);.
272a0 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41      if( pNew!=MA
272b0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
272c0 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71    if( pNew!=pReq
272d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75   ){.        osMu
272e0 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20  nmap(pNew, nNew 
272f0 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20  - nReuse);.     
27300 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
27310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27320 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a    pNew = pOrig;.
27330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
27340 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
27350 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65   attempt to exte
27360 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  nd the existing 
27370 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20  mapping failed. 
27380 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  Free it. */.    
27390 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41  if( pNew==MAP_FA
273a0 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20  ILED || pNew==0 
273b0 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  ){.      osMunma
273c0 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29  p(pOrig, nReuse)
273d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
273e0 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73 74 69  * If pNew is sti
273f0 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20  ll NULL, try to 
27400 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65  create an entire
27410 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20  ly new mapping. 
27420 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
27430 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f   ){.    pNew = o
27440 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66  sMmap(0, nNew, f
27450 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
27460 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , h, 0);.  }..  
27470 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41  if( pNew==MAP_FA
27480 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77  ILED ){.    pNew
27490 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d   = 0;.    nNew =
274a0 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   0;.    unixLogE
274b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20  rror(SQLITE_OK, 
274c0 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68  zErr, pFd->zPath
274d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
274e0 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66  e mmap() above f
274f0 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ailed, assume th
27500 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
27510 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20  t mmap() calls. 
27520 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61     ** will proba
27530 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61  bly fail too. Fa
27540 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67  ll back to using
27550 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 65 78   xRead/xWrite ex
27560 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a  clusively.    **
27570 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
27580 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  */.    pFd->mmap
27590 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d  SizeMax = 0;.  }
275a0 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  .  pFd->pMapRegi
275b0 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65  on = (void *)pNe
275c0 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  w;.  pFd->mmapSi
275d0 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ze = pFd->mmapSi
275e0 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b  zeActual = nNew;
275f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  .}../*.** Memory
27600 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68   map or remap th
27610 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  e file opened by
27620 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
27630 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c   pFd (if the fil
27640 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20  e.** is already 
27650 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73  mapped, the exis
27660 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
27670 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
27680 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a  new). Or, if .**
27690 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
276a0 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
276b0 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
276c0 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
276d0 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ll .** outstandi
276e0 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
276f0 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
27700 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
27710 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
27720 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
27730 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
27740 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
27750 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
27760 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69  of .** the mappi
27770 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74  ng to create. Ot
27780 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74  herwise, if nByt
27790 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
277a0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ero, then the .*
277b0 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
277c0 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
277d0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
277e0 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
277f0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
27800 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
27810 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
27820 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
27830 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
27840 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54   .** using SQLIT
27850 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d  E_FCNTL_MMAP_LIM
27860 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  IT, whichever is
27870 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   smaller..**.** 
27880 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
27890 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
278a0 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69  r occurs (even i
278b0 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  f the mapping is
278c0 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65   not.** recreate
278d0 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  d as a result of
278e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
278f0 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53  erences) or an S
27900 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
27910 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
27920 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27930 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
27940 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74  e *pFd, i64 nByt
27950 65 29 7b 0a 20 20 69 36 34 20 6e 4d 61 70 20 3d  e){.  i64 nMap =
27960 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63   nByte;.  int rc
27970 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ;..  assert( nMa
27980 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
27990 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69  tchOut==0 );.  i
279a0 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
279b0 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
279c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
279d0 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72  Map<0 ){.    str
279e0 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
279f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
27a00 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
27a10 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
27a20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 64  rc = osFstat(pFd
27a30 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  ->h, &statbuf);.
27a40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27a50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
27a60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27a70 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
27a80 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62      nMap = statb
27a90 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a  uf.st_size;.  }.
27aa0 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e    if( nMap>pFd->
27ab0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20  mmapSizeMax ){. 
27ac0 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d     nMap = pFd->m
27ad0 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a  mapSizeMax;.  }.
27ae0 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64  .  if( nMap!=pFd
27af0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
27b00 20 20 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a    if( nMap>0 ){.
27b10 20 20 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66        unixRemapf
27b20 69 6c 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a  ile(pFd, nMap);.
27b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27b40 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
27b50 46 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Fd);.    }.  }..
27b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27b70 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
27b80 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27b90 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
27ba0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
27bb0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
27bc0 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  o a mapping of f
27bd0 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20  ile fd starting 
27be0 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66  at offset.** iOf
27bf0 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d  f. The mapping m
27c00 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72  ust be valid for
27c10 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62   at least nAmt b
27c20 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ytes..**.** If s
27c30 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61  uch a pointer ca
27c40 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73  n be obtained, s
27c50 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61  tore it in *pp a
27c60 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
27c70 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  _OK..** Or, if o
27c80 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f  ne cannot but no
27c90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
27ca0 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20  et *pp to 0 and 
27cb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27cc0 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ..** Finally, if
27cd0 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
27ce0 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20  ccur, return an 
27cf0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
27d00 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20  e. The final.** 
27d10 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20  value of *pp is 
27d20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
27d30 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
27d40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
27d50 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  oes return a poi
27d60 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  nter, the caller
27d70 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79   must eventually
27d80 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65   .** release the
27d90 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61   reference by ca
27da0 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63  lling unixUnfetc
27db0 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
27dc0 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c  nt unixFetch(sql
27dd0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
27de0 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d  64 iOff, int nAm
27df0 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23  t, void **pp){.#
27e00 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
27e10 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
27e20 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
27e30 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
27e40 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
27e50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
27e60 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20  .#endif.  *pp = 
27e70 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  0;..#if SQLITE_M
27e80 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
27e90 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69   if( pFd->mmapSi
27ea0 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69  zeMax>0 ){.    i
27eb0 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
27ec0 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  on==0 ){.      i
27ed0 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66  nt rc = unixMapf
27ee0 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20  ile(pFd, -1);.  
27ef0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27f00 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
27f10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
27f20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
27f30 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
27f40 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
27f50 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
27f60 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
27f70 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
27f80 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
27f90 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
27fa0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
27fb0 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72   If the third ar
27fc0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55  gument is non-NU
27fd0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
27fe0 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20  nction releases 
27ff0 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  a .** reference 
28000 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
28010 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75  arlier call to u
28020 6e 69 78 46 65 74 63 68 28 29 2e 20 54 68 65 20  nixFetch(). The 
28030 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
28040 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
28050 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
28060 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
28070 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
28080 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61  .** argument tha
28090 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  t was passed to 
280a0 74 68 65 20 75 6e 69 78 46 65 74 63 68 28 29 20  the unixFetch() 
280b0 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a  invocation. .**.
280c0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68  ** Or, if the th
280d0 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
280e0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
280f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
28100 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20  g called .** to 
28110 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c  inform the VFS l
28120 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72  ayer that, accor
28130 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61  ding to POSIX, a
28140 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
28150 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20  ing .** may now 
28160 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  be invalid and s
28170 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65  hould be unmappe
28180 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
28190 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c   unixUnfetch(sql
281a0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
281b0 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70  64 iOff, void *p
281c0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
281d0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
281e0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
281f0 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20  (unixFile *)fd; 
28200 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
28210 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
28220 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  e */.  UNUSED_PA
28230 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a  RAMETER(iOff);..
28240 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e    /* If p==0 (un
28250 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66  map the entire f
28260 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20  ile) then there 
28270 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74  must be no outst
28280 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65  anding .  ** xFe
28290 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
282a0 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
282b0 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
282c0 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
282d0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
282e0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
282f0 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
28300 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
28310 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
28320 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
28330 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
28340 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
28350 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
28360 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
28370 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
28380 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
28390 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20  ff] );..  if( p 
283a0 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74  ){.    pFd->nFet
283b0 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65  chOut--;.  }else
283c0 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66  {.    unixUnmapf
283d0 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20  ile(pFd);.  }.. 
283e0 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
283f0 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65  etchOut>=0 );.#e
28400 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
28410 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
28420 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
28430 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
28440 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e  METER(iOff);.#en
28450 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
28460 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
28470 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
28480 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
28490 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
284a0 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
284b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284c0 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
284d0 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
284e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
28500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
28550 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
28560 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  on contains defi
28570 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74  nitions of sqlit
28580 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28590 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d  jects that.** im
285a0 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20  plement various 
285b0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  file locking str
285c0 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73  ategies.  It als
285d0 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  o contains defin
285e0 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69  itions.** of "fi
285f0 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e  nder" functions.
28600 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74    A finder-funct
28610 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ion is used to l
28620 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70  ocate the approp
28630 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33  riate.** sqlite3
28640 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28650 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ct for a particu
28660 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  lar database fil
28670 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  e.  The pAppData
28680 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
28690 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53   sqlite3_vfs VFS
286a0 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69   objects are ini
286b0 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70  tialized to be p
286c0 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68  ointers to.** th
286d0 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72  e correct finder
286e0 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68  -function for th
286f0 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  at VFS..**.** Mo
28700 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  st finder functi
28710 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ons return a poi
28720 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
28730 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28740 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54  ds.** object.  T
28750 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74  he only interest
28760 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ing finder-funct
28770 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49  ion is autolockI
28780 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a  oFinder, which.*
28790 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  * looks at the f
287a0 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61  ilesystem type a
287b0 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73  nd tries to gues
287c0 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  s the best locki
287d0 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66  ng.** strategy f
287e0 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20  rom that..**.** 
287f0 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  For finder-funct
28800 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63  ion F, two objec
28810 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a  ts are created:.
28820 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65  **.**    (1) The
28830 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e   real finder-fun
28840 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d  ction named "FIm
28850 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pt()"..**.**    
28860 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70  (2) A constant p
28870 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66  ointer to this f
28880 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75  unction named ju
28890 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  st "F"..**.**.**
288a0 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
288b0 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75  e F pointer is u
288c0 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44  sed as the pAppD
288d0 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46  ata value for VF
288e0 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57  S.** objects.  W
288f0 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
28900 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  s instead of let
28910 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f  ting pAppData po
28920 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20  int.** directly 
28930 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75  at the finder-fu
28940 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30  nction since C90
28950 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61   rules prevent a
28960 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62   void*.** from b
28970 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75  e cast into a fu
28980 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a  nction pointer..
28990 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  **.**.** Each in
289a0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d  stance of this m
289b0 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74  acro generates t
289c0 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a  wo objects:.**.*
289d0 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e  *   *  A constan
289e0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
289f0 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c  hods object call
28a00 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73   METHOD that has
28a10 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
28a20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20   methods CLOSE, 
28a30 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
28a40 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20  RESLOCK..**.**  
28a50 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f   *  An I/O metho
28a60 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
28a70 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20  n called FINDER 
28a80 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70  that returns a p
28a90 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74  ointer.**      t
28aa0 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a  o the METHOD obj
28ab0 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ect in the previ
28ac0 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23  ous bullet..*/.#
28ad0 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53  define IOMETHODS
28ae0 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56  (FINDER,METHOD,V
28af0 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43  ERSION,CLOSE,LOC
28b00 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c  K,UNLOCK,CKLOCK,
28b10 53 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74  SHMMAP)     \.st
28b20 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
28b30 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
28b40 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28b70 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
28b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
28b90 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
28bc0 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
28bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28be0 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28c10 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
28c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
28c30 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c50 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28c60 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
28c70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
28c80 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28cb0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
28cc0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
28cd0 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28d00 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
28d10 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
28d20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d40 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
28d50 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
28d60 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
28d70 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
28df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e00 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
28e10 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e30 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e50 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
28e60 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e80 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
28e90 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
28ea0 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
28eb0 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
28ee0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
28ef0 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
28f00 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28f20 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
28f30 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
28f40 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
28f50 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28f70 20 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20     SHMMAP,      
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f90 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20  * xShmMap */    
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28fc0 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20    unixShmLock,  
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28fe0 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20   xShmLock */    
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29010 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c   unixShmBarrier,
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29030 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20  xShmBarrier */  
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29050 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29060 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20  unixShmUnmap,   
29070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29080 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20  ShmUnmap */     
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
290b0 6e 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20  nixFetch,       
290c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
290d0 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
29100 69 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20  ixUnfetch,      
29110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
29120 66 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20  fetch */        
29130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29140 20 20 20 20 20 20 20 20 5c 0a 7d 3b 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 20 20 20                  
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 5c 0a 73 74 61 74 69 63 20         \.static 
291a0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
291b0 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52  _methods *FINDER
291c0 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61  ##Impl(const cha
291d0 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a  r *z, unixFile *
291e0 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44  p){   \.  UNUSED
291f0 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55  _PARAMETER(z); U
29200 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29210 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29230 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20       \.  return 
29240 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20  &METHOD;        
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20      \.}         
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292d0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
292e0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
292f0 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49  hods *(*const FI
29300 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72  NDER)(const char
29310 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20  *,unixFile *p)  
29320 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52    \.    = FINDER
29330 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ##Impl;../*.** H
29340 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74  ere are all of t
29350 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
29360 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f  thods objects fo
29370 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
29380 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
29390 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20  ies.  Functions 
293a0 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e  that return poin
293b0 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65  ters to these me
293c0 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73  thods.** are als
293d0 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f  o created..*/.IO
293e0 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78  METHODS(.  posix
293f0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29400 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29410 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
29420 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73    posixIoMethods
29430 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
29440 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29450 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29460 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29480 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e  shared memory an
29490 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c  d mmap are enabl
294a0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
294b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
294c0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
294d0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
294e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
294f0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
29500 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  d */.  unixUnloc
29510 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29520 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
29530 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
29540 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
29550 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
29560 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
29570 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  /.  unixShmMap  
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29590 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
295a0 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
295b0 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
295c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
295d0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
295e0 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
295f0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29600 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29610 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29620 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20  name */.  3,    
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29640 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
29650 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
29660 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
29670 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
29680 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29690 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
296a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
296b0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
296c0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
296d0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
296e0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
296f0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
29700 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
29710 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
29720 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29730 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
29740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29750 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
29760 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
29770 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
29780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
29790 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
297a0 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
297b0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
297c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
297d0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
297e0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
297f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29800 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29810 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
29820 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
29830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29840 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29850 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29870 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
29880 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
29890 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
298a0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
298b0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
298c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a  ReservedLock, /*
298d0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
298e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
298f0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
29900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29910 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
29920 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
29930 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
29940 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66  E.IOMETHODS(.  f
29950 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
29960 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
29970 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29980 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74   */.  flockIoMet
29990 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
299a0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
299b0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
299c0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299e0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
299f0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29a00 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20  .  flockClose,  
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29a30 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20  .  flockLock,   
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a50 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
29a60 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20    flockUnlock,  
29a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29a80 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29a90 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  .  flockCheckRes
29aa0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20  ervedLock,   /* 
29ab0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29ac0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
29af0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
29b00 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
29b10 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
29b20 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b40 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
29b50 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
29b60 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29b70 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
29b80 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
29b90 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
29bc0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
29bd0 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73  ed */.  semXClos
29be0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
29bf0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
29c00 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b  od */.  semXLock
29c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29c20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
29c30 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63  d */.  semXUnloc
29c40 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29c50 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
29c60 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63  od */.  semXChec
29c70 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
29c80 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
29c90 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
29ca0 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29cc0 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
29cd0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
29ce0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
29cf0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
29d00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29d10 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
29d20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
29d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
29d40 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
29d50 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
29d60 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
29d70 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29d80 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29d90 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29db0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29dc0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
29dd0 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29df0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29e00 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
29e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29e20 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
29e30 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e50 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29e60 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
29e70 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a  rvedLock,     /*
29e80 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29e90 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29ea0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
29eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29ec0 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
29ed0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
29ee0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
29ef0 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
29f00 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
29f10 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
29f20 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
29f30 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
29f40 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
29f50 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
29f60 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
29f70 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
29f80 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
29f90 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
29fa0 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
29fb0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
29fc0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
29fd0 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
29fe0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
29ff0 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
2a000 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
2a010 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
2a020 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
2a030 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
2a040 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
2a050 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
2a060 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
2a070 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
2a080 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
2a090 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
2a0a0 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
2a0b0 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
2a0c0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
2a0d0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2a0e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2a0f0 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
2a100 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
2a110 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
2a120 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
2a130 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
2a140 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
2a150 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
2a160 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2a170 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
2a180 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
2a190 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
2a1a0 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
2a1b0 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
2a1c0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2a1d0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2a1e0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2a1f0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
2a200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2a210 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a220 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2a230 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2a240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2a250 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2a260 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  isabled */.  pro
2a270 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
2a280 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2a290 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
2a2a0 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
2a2b0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2a2c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
2a2d0 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
2a2e0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2a2f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
2a300 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
2a310 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock,   /* xCheck
2a320 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2a330 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a350 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2a360 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2a370 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
2a380 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
2a390 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
2a3a0 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
2a3b0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
2a3c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2a3d0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2a3e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2a3f0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2a400 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a420 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2a430 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
2a440 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2a450 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2a460 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2a470 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
2a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a490 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a4a0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2a4b0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
2a4c0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2a4d0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2a4e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2a4f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2a500 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2a510 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
2a520 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2a530 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2a540 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
2a550 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
2a560 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65  ock,     /* xChe
2a570 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2a580 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2a5b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2a5c0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
2a5d0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2a5e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2a5f0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a  KING_STYLE./* .*
2a600 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
2a610 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
2a620 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  s to determine t
2a630 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20  he best locking 
2a640 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72  strategy .** for
2a650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a660 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20  le "filePath".  
2a670 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  It then returns 
2a680 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
2a690 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
2a6a0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2a6b0 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
2a6c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f  **.** This is fo
2a6d0 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a  r MacOSX only..*
2a6e0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2a6f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a700 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
2a710 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
2a720 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
2a730 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
2a740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a750 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2a760 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
2a770 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  * open file obje
2a780 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ct for the datab
2a790 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ase file */.){. 
2a7a0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2a7b0 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20  ruct Mapping {. 
2a7c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2a7d0 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20  Filesystem;     
2a7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2a7f0 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65  system type name
2a800 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71   */.    const sq
2a810 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a820 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a   *pMethods;   /*
2a830 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   Appropriate loc
2a840 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  king method */. 
2a850 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20   } aMap[] = {.  
2a860 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70    { "hfs",    &p
2a870 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
2a880 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20  .    { "ufs",   
2a890 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2a8a0 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73   },.    { "afpfs
2a8b0 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
2a8c0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66  s },.    { "smbf
2a8d0 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
2a8e0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62  ds },.    { "web
2a8f0 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  dav", &nolockIoM
2a900 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2a910 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0, 0 }.  };.  in
2a920 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
2a930 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73  atfs fsInfo;.  s
2a940 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
2a950 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
2a960 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
2a970 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
2a980 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
2a990 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2a9a0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
2a9b0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
2a9c0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2a9d0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
2a9e0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2a9f0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20  IoMethods;.  }. 
2aa00 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65   if( statfs(file
2aa10 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
2aa20 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  = -1 ){.    if( 
2aa30 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
2aa40 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20   MNT_RDONLY ){. 
2aa50 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c       return &nol
2aa60 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2aa70 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
2aa80 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
2aa90 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  stem; i++){.    
2aaa0 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
2aab0 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2aac0 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  , aMap[i].zFiles
2aad0 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  ystem)==0 ){.   
2aae0 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70       return aMap
2aaf0 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20  [i].pMethods;.  
2ab00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ab10 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61  .  /* Default ca
2ab20 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f  se. Handles, amo
2ab30 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66  ngst others, "nf
2ab40 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79  s"..  ** Test by
2ab50 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73  te-range lock us
2ab60 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20  ing fcntl(). If 
2ab70 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64  the call succeed
2ab80 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  s, .  ** assume 
2ab90 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79  that the file-sy
2aba0 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f  stem supports PO
2abb0 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
2abc0 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66   .  */.  lockInf
2abd0 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2abe0 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2abf0 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2ac00 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2ac10 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2ac20 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2ac30 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2ac40 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2ac50 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2ac60 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72   ) {.    if( str
2ac70 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2ac80 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d  ypename, "nfs")=
2ac90 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2aca0 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  rn &nfsIoMethods
2acb0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
2acc0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73       return &pos
2acd0 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ixIoMethods;.   
2ace0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2acf0 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49  return &dotlockI
2ad00 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
2ad10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2ad20 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2ad30 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
2ad40 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
2ad50 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2ad60 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
2ad70 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
2ad80 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
2ad90 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2ada0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2adb0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
2adc0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a  f OS_VXWORKS./*.
2add0 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
2ade0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78   function for Vx
2adf0 57 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20  Works checks to 
2ae00 73 65 65 20 69 66 20 70 6f 73 69 78 20 61 64 76  see if posix adv
2ae10 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  isory.** locking
2ae20 20 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64   works.  If it d
2ae30 6f 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69  oes, then that i
2ae40 73 20 77 68 61 74 20 69 73 20 75 73 65 64 2e 20  s what is used. 
2ae50 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a   If it does not.
2ae60 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61  ** work, then fa
2ae70 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20  llback to named 
2ae80 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
2ae90 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  g..*/.static con
2aea0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2aeb0 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f  thods *vxworksIo
2aec0 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
2aed0 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
2aee0 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
2aef0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2af00 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
2af10 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
2af20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69    /* the open fi
2af30 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  le object */.){.
2af40 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
2af50 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
2af60 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
2af70 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
2af80 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
2af90 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
2afa0 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
2afb0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
2afc0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2afd0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
2afe0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
2aff0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2b000 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20  }..  /* Test if 
2b010 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f  fcntl() is suppo
2b020 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53  rted and use POS
2b030 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a  IX style locks..
2b040 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66    ** Otherwise f
2b050 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
2b060 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
2b070 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c  method..  */.  l
2b080 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
2b090 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
2b0a0 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
2b0b0 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
2b0c0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
2b0d0 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
2b0e0 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
2b0f0 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
2b100 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
2b110 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
2b120 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
2b130 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
2b140 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49      return &semI
2b150 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
2b160 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2b170 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b180 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f  .  *(*const vxwo
2b190 72 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  rksIoFinder)(con
2b1a0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2b1b0 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46  e*) = vxworksIoF
2b1c0 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2b1d0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
2b1e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
2b1f0 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
2b200 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2b210 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  IO method finder
2b220 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79   function:.*/.ty
2b230 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69  pedef const sqli
2b240 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2b250 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63  (*finder_type)(c
2b260 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
2b270 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ile*);.../******
2b280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b2c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2b2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b2e0 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
2b2f0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
2b300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b310 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
2b320 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
2b330 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
2b340 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
2b350 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
2b360 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
2b370 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2b380 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
2b390 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
2b3a0 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
2b3b0 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
2b3c0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
2b3d0 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
2b3e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2b3f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2b400 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
2b410 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
2b420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2b430 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
2b440 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
2b450 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
2b460 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20  ite3_file *pId, 
2b470 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
2b480 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
2b490 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
2b4a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2b4b0 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
2b4c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
2b4d0 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
2b4e0 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20  int ctrlFlags   
2b4f0 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20          /* Zero 
2b500 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45  or more UNIXFILE
2b510 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  _* values */.){.
2b520 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2b530 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63  io_methods *pLoc
2b540 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69  kingStyle;.  uni
2b550 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75  xFile *pNew = (u
2b560 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20  nixFile *)pId;. 
2b570 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b580 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2b590 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55  pNew->pInode==NU
2b5a0 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61  LL );..  /* Usua
2b5b0 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69  lly the path zFi
2b5c0 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f  lename should no
2b5d0 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20  t be a relative 
2b5e0 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20  pathname. The.  
2b5f0 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  ** exception is 
2b600 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
2b610 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66   proxy "conch" f
2b620 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68  ile in builds th
2b630 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20  at.  ** include 
2b640 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c  the special Appl
2b650 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73  e locking styles
2b660 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
2b670 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2b680 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2b690 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61  OCKING_STYLE.  a
2b6a0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2b6b0 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
2b6c0 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c  [0]=='/' .    ||
2b6d0 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d   pVfs->pAppData=
2b6e0 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63  =(void*)&autoloc
2b6f0 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c  kIoFinder );.#el
2b700 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  se.  assert( zFi
2b710 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
2b720 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  lename[0]=='/' )
2b730 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e  ;.#endif..  /* N
2b740 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73  o locking occurs
2b750 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69   in temporary fi
2b760 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
2b770 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c   zFilename!=0 ||
2b780 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e   (ctrlFlags & UN
2b790 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d  IXFILE_NOLOCK)!=
2b7a0 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  0 );..  OSTRACE(
2b7b0 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
2b7c0 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  s\n", h, zFilena
2b7d0 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20  me));.  pNew->h 
2b7e0 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66  = h;.  pNew->pVf
2b7f0 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77  s = pVfs;.  pNew
2b800 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  ->zPath = zFilen
2b810 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72  ame;.  pNew->ctr
2b820 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72  lFlags = (u8)ctr
2b830 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49  lFlags;.#if SQLI
2b840 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2b850 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53  >0.  pNew->mmapS
2b860 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  izeMax = sqlite3
2b870 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
2b880 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  map;.#endif.  if
2b890 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
2b8a0 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67  olean(((ctrlFlag
2b8b0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49  s & UNIXFILE_URI
2b8c0 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20  ) ? zFilename : 
2b8d0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2b8f0 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f  psow", SQLITE_PO
2b900 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2b910 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  E) ){.    pNew->
2b920 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2b930 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a  XFILE_PSOW;.  }.
2b940 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66    if( strcmp(pVf
2b950 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65  s->zName,"unix-e
2b960 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  xcl")==0 ){.    
2b970 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2b980 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  |= UNIXFILE_EXCL
2b990 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
2b9a0 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49  WORKS.  pNew->pI
2b9b0 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46  d = vxworksFindF
2b9c0 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29  ileId(zFilename)
2b9d0 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49  ;.  if( pNew->pI
2b9e0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c  d==0 ){.    ctrl
2b9f0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2ba00 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63  E_NOLOCK;.    rc
2ba10 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2ba20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2ba30 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55  f( ctrlFlags & U
2ba40 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
2ba50 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
2ba60 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  yle = &nolockIoM
2ba70 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
2ba80 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
2ba90 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f  le = (**(finder_
2baa0 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70  type*)pVfs->pApp
2bab0 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c  Data)(zFilename,
2bac0 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49   pNew);.#if SQLI
2bad0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2bae0 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
2baf0 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
2bb00 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
2bb10 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
2bb20 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
2bb30 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
2bb40 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
2bb50 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
2bb60 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
2bb70 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
2bb80 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
2bb90 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
2bba0 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
2bbb0 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
2bbc0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
2bbd0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
2bbe0 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
2bbf0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
2bc00 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2bc10 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
2bc20 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ds.#if defined(_
2bc30 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2bc40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2bc50 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20  NG_STYLE.    || 
2bc60 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2bc70 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23   &nfsIoMethods.#
2bc80 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75  endif.  ){.    u
2bc90 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2bca0 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
2bcb0 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2bcc0 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2bcd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bce0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
2bcf0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2bd00 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  rred in findInod
2bd10 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
2bd20 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2bd30 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
2bd40 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
2bd50 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
2bd60 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
2bd70 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
2bd80 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
2bd90 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
2bda0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
2bdb0 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
2bdc0 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
2bdd0 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
2bde0 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
2bdf0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
2be00 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
2be10 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
2be20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
2be30 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
2be40 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
2be50 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
2be60 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
2be70 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
2be80 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
2be90 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
2bea0 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
2beb0 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
2bec0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2bed0 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
2bee0 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
2bef0 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
2bf00 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
2bf10 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
2bf20 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
2bf30 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
2bf40 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
2bf50 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
2bf60 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
2bf70 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
2bf80 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
2bf90 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
2bfa0 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
2bfb0 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
2bfc0 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
2bfd0 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
2bfe0 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
2bff0 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
2c000 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
2c010 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
2c020 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
2c030 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
2c040 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
2c050 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
2c060 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2c070 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2c080 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2c090 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
2c0a0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2c0b0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
2c0c0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2c0d0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2c0e0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2c0f0 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
2c100 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2c110 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
2c120 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
2c130 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2c140 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2c150 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
2c160 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
2c170 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
2c180 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
2c190 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2c1a0 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
2c1b0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2c1c0 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
2c1d0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
2c1e0 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
2c1f0 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
2c200 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c210 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2c220 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
2c230 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
2c240 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
2c250 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
2c260 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
2c270 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
2c280 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
2c290 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
2c2a0 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
2c2b0 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
2c2c0 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
2c2d0 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
2c2e0 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
2c2f0 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
2c300 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
2c310 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
2c320 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
2c330 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
2c340 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2c350 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2c360 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
2c370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c380 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2c390 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
2c3a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
2c3b0 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2c3c0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2c3d0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
2c3e0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   h = -1;.      }
2c3f0 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65  .      unixLeave
2c400 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
2c410 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2c420 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  f..  else if( pL
2c430 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2c440 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2c450 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69   ){.    /* Dotfi
2c460 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  le locking uses 
2c470 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2c480 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
2c490 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
2c4a0 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
2c4b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20  ckingContext .  
2c4c0 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
2c4d0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e  LockFile;.    in
2c4e0 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  t nFilename;.   
2c4f0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2c500 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69  me!=0 );.    nFi
2c510 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  lename = (int)st
2c520 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
2c530 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69  + 6;.    zLockFi
2c540 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  le = (char *)sql
2c550 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c  ite3_malloc(nFil
2c560 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
2c570 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
2c580 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c590 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
2c5a0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2c5b0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
2c5c0 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
2c5d0 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55   "%s" DOTLOCK_SU
2c5e0 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  FFIX, zFilename)
2c5f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
2c600 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2c610 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20   = zLockFile;.  
2c620 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2c630 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  S.  else if( pLo
2c640 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73  ckingStyle == &s
2c650 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  emIoMethods ){. 
2c660 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61     /* Named sema
2c670 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73  phore locking us
2c680 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2c690 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2c6a0 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64  be.    ** includ
2c6b0 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63  ed in the semLoc
2c6c0 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20  kingContext.    
2c6d0 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  */.    unixEnter
2c6e0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
2c6f0 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
2c700 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
2c710 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ode);.    if( (r
2c720 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
2c730 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e   (pNew->pInode->
2c740 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
2c750 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
2c760 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f  ame = pNew->pIno
2c770 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20  de->aSemName;.  
2c780 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2c790 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c7a0 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
2c7b0 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73  zSemName, "/%s.s
2c7c0 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  em",.           
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
2c7e0 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
2c7f0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  lName);.      fo
2c800 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65  r( n=1; zSemName
2c810 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20  [n]; n++ ).     
2c820 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b     if( zSemName[
2c830 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61  n]=='/' ) zSemNa
2c840 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20  me[n] = '_';.   
2c850 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2c860 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e  >pSem = sem_open
2c870 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45  (zSemName, O_CRE
2c880 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20  AT, 0666, 1);.  
2c890 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49      if( pNew->pI
2c8a0 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  node->pSem == SE
2c8b0 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
2c8c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c8d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
2c8e0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2c8f0 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b  mName[0] = '\0';
2c900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c910 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2c920 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  x();.  }.#endif.
2c930 20 20 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72    .  storeLastEr
2c940 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69  rno(pNew, 0);.#i
2c950 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
2c960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c970 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2c980 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2c990 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2c9a0 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
2c9b0 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
2c9c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  lename);.    pNe
2c9d0 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2c9e0 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
2c9f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2ca00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ca10 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
2ca20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
2ca30 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2ca40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ca50 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
2ca60 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2ca70 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
2ca80 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62  1);.    verifyDb
2ca90 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  File(pNew);.  }.
2caa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cab0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2cac0 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
2cad0 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  tory in which to
2cae0 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66   put temporary f
2caf0 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73  iles..** If no s
2cb00 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72  uitable temporar
2cb10 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79  y file directory
2cb20 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
2cb30 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
2cb40 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2cb50 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69   *unixTempFileDi
2cb60 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
2cb70 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
2cb80 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
2cb90 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
2cba0 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
2cbb0 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
2cbc0 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
2cbd0 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20  ,.     0        
2cbe0 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74  /* List terminat
2cbf0 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73  or */.  };.  uns
2cc00 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
2cc10 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2cc20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2cc30 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72  ir = 0;..  azDir
2cc40 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
2cc50 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
2cc60 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
2cc70 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
2cc80 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
2cc90 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a  DIR");.  if( !az
2cca0 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73  Dirs[2] ) azDirs
2ccb0 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [2] = getenv("TM
2ccc0 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d  PDIR");.  for(i=
2ccd0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
2cce0 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
2ccf0 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69  s[0]); zDir=azDi
2cd00 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66  rs[i++]){.    if
2cd10 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74  ( zDir==0 ) cont
2cd20 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
2cd30 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29  Stat(zDir, &buf)
2cd40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2cd50 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75   if( !S_ISDIR(bu
2cd60 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e  f.st_mode) ) con
2cd70 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f  tinue;.    if( o
2cd80 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37  sAccess(zDir, 07
2cd90 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2cda0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
2cdb0 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f  eturn zDir;.}../
2cdc0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
2cdd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
2cde0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
2cdf0 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
2ce00 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
2ce10 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
2ce20 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
2ce30 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
2ce40 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
2ce50 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
2ce60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2ce70 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
2ce80 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2ce90 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  uf){.  static co
2cea0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2ceb0 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
2cec0 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
2ced0 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
2cee0 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
2cef0 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
2cf00 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
2cf10 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
2cf20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68  i, j;.  const ch
2cf30 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20  ar *zDir;..  /* 
2cf40 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
2cf50 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
2cf60 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
2cf70 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
2cf80 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
2cf90 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
2cfa0 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
2cfb0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
2cfc0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
2cfd0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
2cfe0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
2cff0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2d000 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
2d010 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70   zDir = unixTemp
2d020 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28  FileDir();.  if(
2d030 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20   zDir==0 ) zDir 
2d040 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65  = ".";..  /* Che
2d050 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
2d060 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
2d070 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
2d080 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
2d090 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
2d0a0 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
2d0b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
2d0c0 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c    */.  if( (strl
2d0d0 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65  en(zDir) + strle
2d0e0 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  n(SQLITE_TEMP_FI
2d0f0 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29  LE_PREFIX) + 18)
2d100 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66   >= (size_t)nBuf
2d110 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d120 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2d130 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ..  do{.    sqli
2d140 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
2d150 66 2d 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f  f-18, zBuf, "%s/
2d160 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
2d170 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b  E_PREFIX, zDir);
2d180 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74  .    j = (int)st
2d190 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
2d1a0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2d1b0 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
2d1c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2d1d0 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
2d1e0 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20        zBuf[j] = 
2d1f0 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
2d200 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
2d210 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
2d220 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20  Chars)-1) ];.   
2d230 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d   }.    zBuf[j] =
2d240 20 30 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31   0;.    zBuf[j+1
2d250 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
2d260 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30   osAccess(zBuf,0
2d270 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2d280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
2d290 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2d2a0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2d2b0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2d2c0 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  E__)./*.** Routi
2d2d0 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  ne to transform 
2d2e0 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20  a unixFile into 
2d2f0 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  a proxy-locking 
2d300 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70  unixFile..** Imp
2d310 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74  lementation in t
2d320 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69  he proxy-lock di
2d330 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64  vision, but used
2d340 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a   by unixOpen().*
2d350 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  * if SQLITE_PREF
2d360 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2d370 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
2d380 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2d390 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
2d3a0 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e  e(unixFile*, con
2d3b0 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69  st char*);.#endi
2d3c0 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  f../*.** Search 
2d3d0 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2d3e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
2d3f0 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  at was opened on
2d400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
2d410 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  * file (not a jo
2d420 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d  urnal or master-
2d430 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64  journal file) id
2d440 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68  entified by path
2d450 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69  name.** zPath wi
2d460 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58  th SQLITE_OPEN_X
2d470 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e  XX flags matchin
2d480 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61  g those passed a
2d490 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
2d4a0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2d4b0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
2d4c0 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73   Such a file des
2d4d0 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73  criptor may exis
2d4e0 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  t if a database 
2d4f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63  connection was c
2d500 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65  losed.** but the
2d510 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
2d520 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c   descriptor coul
2d530 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  d not be closed 
2d540 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20  because some.** 
2d550 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
2d560 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  iptor open on th
2d570 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68  e same file is h
2d580 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f  olding a file-lo
2d590 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20  ck..** Refer to 
2d5a0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
2d5b0 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63  unixClose() func
2d5c0 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e  tion and the len
2d5d0 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20  gthy comment.** 
2d5e0 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69  describing "Posi
2d5f0 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
2d600 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74  ng" at the start
2d610 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f   of this file fo
2d620 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65  r .** further de
2d630 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63  tails. Also, tic
2d640 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a  ket #4018..**.**
2d650 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66   If a suitable f
2d660 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2d670 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74  s found, then it
2d680 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2d690 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65   no.** such file
2d6a0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c   descriptor is l
2d6b0 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65  ocated, -1 is re
2d6c0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2d6d0 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a  c UnixUnusedFd *
2d6e0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63  findReusableFd(c
2d6f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2d700 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2d710 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2d720 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nused = 0;..  /*
2d730 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66   Do not search f
2d740 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
2d750 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
2d760 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63  vxworks. Not bec
2d770 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b  ause.  ** vxwork
2d780 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65  s would not bene
2d790 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61  fit from the cha
2d7a0 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77  nge (it might, w
2d7b0 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a  e're not sure),.
2d7c0 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65    ** but because
2d7d0 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20   no way to test 
2d7e0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2d7f0 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73  available. It is
2d800 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f   better .  ** no
2d810 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69  t to risk breaki
2d820 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f  ng vxworks suppo
2d830 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20  rt for the sake 
2d840 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75  of such an obscu
2d850 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65  re .  ** feature
2d860 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58  .  */.#if !OS_VX
2d870 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73  WORKS.  struct s
2d880 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2d890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d8a0 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28  Results of stat(
2d8b0 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ) call */..  /* 
2d8c0 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61  A stat() call ma
2d8d0 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f  y fail for vario
2d8e0 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74  us reasons. If t
2d8f0 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20  his happens, it 
2d900 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63  is.  ** almost c
2d910 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f  ertain that an o
2d920 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68  pen() call on th
2d930 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c  e same path will
2d940 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a   also fail..  **
2d950 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
2d960 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
2d970 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74  curs in the stat
2d980 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74  () call here, it
2d990 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64   is.  ** ignored
2d9a0 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72   and -1 is retur
2d9b0 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
2d9c0 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e  will try to open
2d9d0 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a   a new file.  **
2d9e0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74   descriptor on t
2d9f0 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61  he same path, fa
2da00 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  il, and return a
2da10 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74  n error to SQLit
2da20 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65  e..  **.  ** Eve
2da30 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  n if a subsequen
2da40 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f  t open() call do
2da50 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20  es succeed, the 
2da60 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a  consequences of.
2da70 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69    ** not searchi
2da80 6e 67 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c  ng for a reusabl
2da90 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2daa0 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20  r are not dire. 
2dab0 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53   */.  if( 0==osS
2dac0 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61  tat(zPath, &sSta
2dad0 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e  t) ){.    unixIn
2dae0 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
2daf0 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ..    unixEnterM
2db00 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f  utex();.    pIno
2db10 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
2db20 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64      while( pInod
2db30 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69  e && (pInode->fi
2db40 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e  leId.dev!=sStat.
2db50 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20  st_dev.         
2db60 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
2db70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
2db80 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  o!=sStat.st_ino)
2db90 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64   ){.       pInod
2dba0 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
2dbb0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2dbc0 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20   pInode ){.     
2dbd0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a   UnixUnusedFd **
2dbe0 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70  pp;.      for(pp
2dbf0 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  =&pInode->pUnuse
2dc00 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d  d; *pp && (*pp)-
2dc10 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70  >flags!=flags; p
2dc20 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
2dc30 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  ));.      pUnuse
2dc40 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69  d = *pp;.      i
2dc50 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2dc60 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75        *pp = pUnu
2dc70 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  sed->pNext;.    
2dc80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
2dc90 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2dca0 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a    }.#endif    /*
2dcb0 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20   if !OS_VXWORKS 
2dcc0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75  */.  return pUnu
2dcd0 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sed;.}../*.** Th
2dce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2dcf0 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65  alled by unixOpe
2dd00 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  n() to determine
2dd10 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73   the unix permis
2dd20 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61  sions.** to crea
2dd30 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74  te new files wit
2dd40 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  h. If no error o
2dd50 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2dd60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2dd70 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65  d.** and a value
2dd80 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61   suitable for pa
2dd90 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69  ssing as the thi
2dda0 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  rd argument to o
2ddb0 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69  pen(2) is.** wri
2ddc0 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20  tten to *pMode. 
2ddd0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2dde0 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
2ddf0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
2de00 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
2de10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d  the value of *pM
2de20 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66  ode is not modif
2de30 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f  ied..**.** In mo
2de40 73 74 20 63 61 73 65 73 2c 20 74 68 69 73 20 72  st cases, this r
2de50 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f  outine sets *pMo
2de60 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77  de to 0, which w
2de70 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e  ill become.** an
2de80 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72   indication to r
2de90 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20  obust_open() to 
2dea0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20  create the file 
2deb0 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
2dec0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2ded0 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65  MISSIONS adjuste
2dee0 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
2def0 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69  ** But if the fi
2df00 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2df10 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
2df20 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2df30 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
2df40 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
2df50 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2df60 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
2df70 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
2df80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
2df90 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2dfa0 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
2dfb0 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
2dfc0 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
2dfd0 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
2dfe0 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
2dff0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
2e000 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
2e010 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
2e020 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2e030 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2e040 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2e050 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20  _3_NAMES option 
2e060 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2e070 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
2e080 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61   filename is una
2e090 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38  vailable.  But 8
2e0a0 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79  _3_NAMES is only
2e0b0 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54   used for.** FAT
2e0c0 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64   filesystems and
2e0d0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20   permissions do 
2e0e0 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65  not matter there
2e0f0 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a  , so just use.**
2e100 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72   the default per
2e110 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  missions..*/.sta
2e120 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61  tic int findCrea
2e130 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f  teFileMode(.  co
2e140 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e160 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70   Path of file (p
2e170 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63  ossibly) being c
2e180 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  reated */.  int 
2e190 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e1b0 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34  lags passed as 4
2e1c0 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  th argument to x
2e1d0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65  Open() */.  mode
2e1e0 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20  _t *pMode,      
2e1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e200 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20  UT: Permissions 
2e210 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74  to open file wit
2e220 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55  h */.  uid_t *pU
2e230 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2e240 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75         /* OUT: u
2e250 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2e260 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74   file */.  gid_t
2e270 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
2e280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2e290 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: gid to set on
2e2a0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a   the file */.){.
2e2b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2e2c0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2e2d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2e2e0 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30   */.  *pMode = 0
2e2f0 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20  ;.  *pUid = 0;. 
2e300 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66   *pGid = 0;.  if
2e310 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
2e320 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
2e330 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2e340 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NAL) ){.    char
2e350 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
2e360 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
2e370 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
2e380 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e3b0 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
2e3c0 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75   zDb */.    stru
2e3d0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
2e3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2e3f0 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
2e400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2e410 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20  /..    /* zPath 
2e420 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57  is a path to a W
2e430 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  AL or journal fi
2e440 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
2e450 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a  g block derives.
2e460 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20      ** the path 
2e470 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
2e480 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
2e490 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73  from zPath. This
2e4a0 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20   block handles. 
2e4b0 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
2e4c0 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65  ing naming conve
2e4d0 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20  ntions:.    **. 
2e4e0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2e4f0 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20  o db>-journal". 
2e500 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2e510 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a  o db>-wal".    *
2e520 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2e530 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20  >-journalNN".   
2e540 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2e550 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a  db>-walNN".    *
2e560 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
2e570 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e  N is a decimal n
2e580 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61  umber. The NN na
2e590 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  ming schemes are
2e5a0 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79   .    ** used by
2e5b0 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70   the test_multip
2e5c0 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20  lex.c module..  
2e5d0 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73    */.    nDb = s
2e5e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2e5f0 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64  Path) - 1; .#ifd
2e600 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2e610 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77  _8_3_NAMES.    w
2e620 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73  hile( nDb>0 && s
2e630 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50  qlite3Isalnum(zP
2e640 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d  ath[nDb]) ) nDb-
2e650 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d  -;.    if( nDb==
2e660 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21  0 || zPath[nDb]!
2e670 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51  ='-' ) return SQ
2e680 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
2e690 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b     while( zPath[
2e6a0 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  nDb]!='-' ){.   
2e6b0 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30     assert( nDb>0
2e6c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2e6d0 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c  ( zPath[nDb]!='\
2e6e0 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d  n' );.      nDb-
2e6f0 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  -;.    }.#endif.
2e700 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
2e710 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
2e720 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
2e730 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73  ;..    if( 0==os
2e740 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74  Stat(zDb, &sStat
2e750 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64  ) ){.      *pMod
2e760 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
2e770 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20  e & 0777;.      
2e780 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pUid = sStat.st
2e790 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69  _uid;.      *pGi
2e7a0 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64  d = sStat.st_gid
2e7b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e7c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2e7d0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
2e7e0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  }.  }else if( fl
2e7f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2e800 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
2e810 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  ){.    *pMode = 
2e820 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  0600;.  }.  retu
2e830 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e840 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
2e850 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
2e860 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
2e870 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
2e880 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
2e890 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
2e8a0 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
2e8b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2e8c0 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
2e8d0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2e8e0 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
2e8f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2e900 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
2e910 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
2e920 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
2e930 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
2e940 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
2e950 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
2e960 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
2e970 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2e980 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
2e990 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
2e9a0 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
2e9b0 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
2e9c0 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
2e9d0 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
2e9e0 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
2e9f0 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
2ea00 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
2ea10 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
2ea20 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
2ea30 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
2ea40 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
2ea50 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
2ea60 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
2ea70 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
2ea80 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
2ea90 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
2eaa0 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
2eab0 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
2eac0 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
2ead0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
2eae0 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
2eaf0 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
2eb00 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
2eb10 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
2eb20 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
2eb30 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2eb40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2eb50 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20  e VFS for which 
2eb60 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65  this is the xOpe
2eb70 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  n method */.  co
2eb80 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2eb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2eba0 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  thname of file t
2ebb0 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
2ebc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
2ebd0 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  File,         /*
2ebe0 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
2ebf0 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65  ptor to be fille
2ec00 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  d in */.  int fl
2ec10 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2ec20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
2ec30 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  flags to control
2ec40 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a   the opening */.
2ec50 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
2ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ec70 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72  * Output flags r
2ec80 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
2ec90 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  e core */.){.  u
2eca0 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
2ecb0 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ixFile *)pFile;.
2ecc0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20    int fd = -1;  
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ece0 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2ecf0 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  tor returned by 
2ed00 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
2ed10 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20  openFlags = 0;  
2ed20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2ed30 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
2ed40 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
2ed50 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
2ed60 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
2ed70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
2ed80 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  n */.  int noLoc
2ed90 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2eda0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2edb0 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
2edc0 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
2edd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ede0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2edf0 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
2ee00 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74  Code */.  int ct
2ee10 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  rlFlags = 0;    
2ee20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58           /* UNIX
2ee30 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
2ee40 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
2ee50 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
2ee60 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
2ee70 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
2ee80 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
2ee90 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2eea0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
2eeb0 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
2eec0 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
2eed0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2eee0 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
2eef0 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
2ef00 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
2ef10 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
2ef20 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
2ef30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2ef40 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23  EN_READWRITE);.#
2ef50 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2ef60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2ef70 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79   int isAutoProxy
2ef80 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2ef90 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
2efa0 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  XY);.#endif.#if 
2efb0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2efc0 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
2efd0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2efe0 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
2eff0 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66  s fsInfo;.#endif
2f000 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
2f010 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
2f020 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
2f030 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2f040 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
2f050 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
2f060 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
2f070 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
2f080 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
2f090 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
2f0a0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
2f0b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
2f0c0 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
2f0d0 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
2f0e0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
2f0f0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
2f100 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
2f110 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2f120 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2f130 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2f140 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f150 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
2f160 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f170 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
2f180 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
2f190 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
2f1a0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
2f1b0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
2f1c0 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
2f1d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
2f1e0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
2f1f0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
2f200 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
2f210 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
2f220 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a  AX_PATHNAME+2];.
2f230 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2f240 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
2f250 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
2f260 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
2f270 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
2f280 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
2f290 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
2f2a0 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
2f2b0 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
2f2c0 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
2f2d0 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
2f2e0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
2f2f0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
2f300 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
2f310 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
2f320 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
2f330 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2f340 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2f350 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
2f360 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
2f370 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
2f380 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
2f390 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
2f3a0 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
2f3b0 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
2f3c0 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
2f3d0 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
2f3e0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
2f3f0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
2f400 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
2f410 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
2f420 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
2f430 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
2f440 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
2f450 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
2f460 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
2f470 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
2f480 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
2f490 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
2f4a0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2f4b0 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
2f4c0 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
2f4d0 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
2f4e0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2f4f0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2f500 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2f510 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
2f520 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2f530 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2f540 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2f550 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
2f560 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2f570 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2f580 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2f590 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2f5a0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2f5b0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2f5c0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2f5d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2f5e0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
2f5f0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
2f600 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
2f610 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
2f620 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
2f630 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
2f640 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f650 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
2f660 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2f670 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
2f680 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2f690 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2f6a0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
2f6b0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
2f6c0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2f6d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f6e0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
2f6f0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f700 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2f710 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2f720 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f730 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
2f740 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f750 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
2f760 20 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69    /* Detect a pi
2f770 64 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73  d change and res
2f780 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68  et the PRNG.  Th
2f790 65 72 65 20 69 73 20 61 20 72 61 63 65 20 63 6f  ere is a race co
2f7a0 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72  ndition.  ** her
2f7b0 65 20 73 75 63 68 20 74 68 61 74 20 74 77 6f 20  e such that two 
2f7c0 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20  or more threads 
2f7d0 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70  all trying to op
2f7e0 65 6e 20 64 61 74 61 62 61 73 65 73 20 61 74 0a  en databases at.
2f7f0 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e    ** the same in
2f800 73 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20  stant might all 
2f810 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20  reset the PRNG. 
2f820 20 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65   But multiple re
2f830 73 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61  sets.  ** are ha
2f840 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  rmless..  */.  i
2f850 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  f( randomnessPid
2f860 21 3d 6f 73 47 65 74 70 69 64 28 29 20 29 7b 0a  !=osGetpid() ){.
2f870 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69      randomnessPi
2f880 64 20 3d 20 6f 73 47 65 74 70 69 64 28 29 3b 0a  d = osGetpid();.
2f890 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2f8a0 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d  omness(0,0);.  }
2f8b0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
2f8c0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
2f8d0 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
2f8e0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2f8f0 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
2f900 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2f910 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
2f920 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2f930 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
2f940 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2f950 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
2f960 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
2f970 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
2f980 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
2f990 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
2f9a0 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
2f9b0 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
2f9c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f9d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2f9e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2f9f0 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
2fa00 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62  d;..    /* Datab
2fa10 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
2fa20 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
2fa30 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
2fa40 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   are not.    ** 
2fa50 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
2fa60 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
2fa70 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
2fa80 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20   passed into.   
2fa90 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
2faa0 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
2fab0 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
2fac0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2fad0 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73  _URI) || zName[s
2fae0 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
2faf0 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69  =0 );..  }else i
2fb00 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
2fb10 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2fb20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
2fb30 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
2fb40 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
2fb50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
2fb60 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63  sDelete && !sync
2fb70 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  Dir);.    rc = u
2fb80 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
2fb90 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a  AX_PATHNAME+2, z
2fba0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
2fbb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fbc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fbd0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
2fbe0 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
2fbf0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
2fc00 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2fc10 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73  names are always
2fc20 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
2fc30 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66  minated.    ** f
2fc40 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65  or use by sqlite
2fc50 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
2fc60 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ). */.    assert
2fc70 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a  ( zName[strlen(z
2fc80 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20  Name)+1]==0 );. 
2fc90 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69   }..  /* Determi
2fca0 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ne the value of 
2fcb0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2fcc0 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f  ter passed to PO
2fcd0 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  SIX function.  *
2fce0 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20  * open(). These 
2fcf0 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74  must be calculat
2fd00 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28  ed even if open(
2fd10 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c  ) is not called,
2fd20 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61   as.  ** they ma
2fd30 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70  y be stored as p
2fd40 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
2fd50 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20  handle and used 
2fd60 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f  by the .  ** 'co
2fd70 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e  nch file' lockin
2fd80 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65  g functions late
2fd90 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  r on.  */.  if( 
2fda0 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70  isReadonly )  op
2fdb0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
2fdc0 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61  NLY;.  if( isRea
2fdd0 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61  dWrite ) openFla
2fde0 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20  gs |= O_RDWR;.  
2fdf0 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20  if( isCreate )  
2fe00 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2fe10 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73  _CREAT;.  if( is
2fe20 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e  Exclusive ) open
2fe30 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  Flags |= (O_EXCL
2fe40 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
2fe50 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
2fe60 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
2fe70 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30  RY);..  if( fd<0
2fe80 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f   ){.    mode_t o
2fe90 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  penMode;        
2fea0 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73        /* Permiss
2feb0 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66  ions to create f
2fec0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20  ile with */.    
2fed0 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20  uid_t uid;      
2fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fef0 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20   Userid for the 
2ff00 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f  file */.    gid_
2ff10 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  t gid;          
2ff20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f            /* Gro
2ff30 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  upid for the fil
2ff40 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69  e */.    rc = fi
2ff50 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
2ff60 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26  (zName, flags, &
2ff70 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20  openMode, &uid, 
2ff80 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  &gid);.    if( r
2ff90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ffa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
2ffb0 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20  ->pUnused );.   
2ffc0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2ffd0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2ffe0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
2fff0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30000 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65  RNAL );.      re
30010 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
30020 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
30030 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
30040 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
30050 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
30060 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30  PENX   %-3d %s 0
30070 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65  %o\n", fd, zName
30080 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20  , openFlags));. 
30090 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
300a0 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20  rrno!=EISDIR && 
300b0 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
300c0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
300d0 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74       /* Failed t
300e0 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
300f0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
30100 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d  ccess. Try read-
30110 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66  only. */.      f
30120 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
30130 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
30140 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
30150 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  TE);.      openF
30160 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52  lags &= ~(O_RDWR
30170 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20  |O_CREAT);.     
30180 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
30190 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
301a0 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
301b0 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20  |= O_RDONLY;.   
301c0 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
301d0 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f  1;.      fd = ro
301e0 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
301f0 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
30200 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mode);.    }.   
30210 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
30220 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
30230 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
30240 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
30250 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
30260 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
30270 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hed;.    }..    
30280 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  /* If this proce
30290 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  ss is running as
302a0 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65   root and if cre
302b0 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c  ating a new roll
302c0 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
302d0 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c  nal or WAL file,
302e0 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68   set the ownersh
302f0 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ip of the journa
30300 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20  l or WAL to be. 
30310 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61     ** the same a
30320 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
30330 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
30340 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
30350 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
30360 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
30370 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
30380 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c      osFchown(fd,
30390 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20   uid, gid);.    
303a0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
303b0 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
303c0 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
303d0 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
303e0 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
303f0 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
30400 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
30410 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
30420 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
30430 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
30440 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
30450 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
30460 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
30470 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
30480 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f  TE_UNLINK_AFTER_
30490 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61 74 68  CLOSE).    zPath
304a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
304b0 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%s", zName);
304c0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  .    if( zPath==
304d0 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
304e0 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
304f0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
30500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
30510 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  MEM;.    }.#else
30520 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e  .    osUnlink(zN
30530 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
30540 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
30550 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
30560 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
30570 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
30580 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
30590 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54  f..  noLock = eT
305a0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
305b0 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69  _MAIN_DB;..  .#i
305c0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
305d0 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
305e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
305f0 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74 66  YLE.  if( fstatf
30600 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
30610 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f 72  = -1 ){.    stor
30620 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20 65 72  eLastErrno(p, er
30630 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74  rno);.    robust
30640 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
30650 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74  LINE__);.    ret
30660 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
30670 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69  _ACCESS;.  }.  i
30680 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
30690 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e  "msdos", fsInfo.
306a0 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
306b0 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
306c0 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
306d0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
306e0 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
306f0 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
30700 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20  trncmp("exfat", 
30710 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
30720 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
30730 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
30740 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
30750 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
30760 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69  MSDOS;.  }.#endi
30770 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61  f..  /* Set up a
30780 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46  ppropriate ctrlF
30790 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73  lags */.  if( is
307a0 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20 20  Delete )        
307b0 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
307c0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
307d0 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65  LETE;.  if( isRe
307e0 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20  adonly )        
307f0 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
30800 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  |= UNIXFILE_RDON
30810 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  LY;.  if( noLock
30820 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
30830 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
30840 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
30850 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72 20  ;.  if( syncDir 
30860 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
30870 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
30880 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
30890 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
308a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29  QLITE_OPEN_URI )
308b0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
308c0 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66  IXFILE_URI;..#if
308d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
308e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66  OCKING_STYLE.#if
308f0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
30900 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69  ROXY_LOCKING.  i
30910 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a  sAutoProxy = 1;.
30920 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41  #endif.  if( isA
30930 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61  utoProxy && (zPa
30940 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e  th!=NULL) && (!n
30950 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e  oLock) && pVfs->
30960 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  xOpen ){.    cha
30970 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65  r *envforce = ge
30980 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52  tenv("SQLITE_FOR
30990 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
309a0 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50  ");.    int useP
309b0 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  roxy = 0;..    /
309c0 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  * SQLITE_FORCE_P
309d0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20  ROXY_LOCKING==1 
309e0 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61  means force alwa
309f0 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20  ys use proxy, 0 
30a00 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65  means .    ** ne
30a10 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e  ver use proxy, N
30a20 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72  ULL means use pr
30a30 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61  oxy for non-loca
30a40 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a  l files only.  *
30a50 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72  /.    if( envfor
30a60 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ce!=NULL ){.    
30a70 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f    useProxy = ato
30a80 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20  i(envforce)>0;. 
30a90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30aa0 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49  useProxy = !(fsI
30ab0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
30ac0 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  LOCAL);.    }.  
30ad0 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29    if( useProxy )
30ae0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c  {.      rc = fil
30af0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
30b00 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  , fd, pFile, zPa
30b10 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a  th, ctrlFlags);.
30b20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30b40 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
30b50 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
30b60 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
30b70 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
30b80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30b90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30ba0 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c     /* Use unixCl
30bb0 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ose to clean up 
30bc0 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64  the resources ad
30bd0 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69  ded in fillInUni
30be0 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20  xFile .         
30bf0 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c   ** and clear al
30c00 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27  l the structure'
30c10 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53  s references.  S
30c20 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20  pecifically, .  
30c30 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65          ** pFile
30c40 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20  ->pMethods will 
30c50 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74  be NULL so sqlit
30c60 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62  e3OsClose will b
30c70 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20  e a no-op .     
30c80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30c90 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c    unixClose(pFil
30ca0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
30cb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
30cc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30cd0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
30ce0 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  hed;.    }.  }.#
30cf0 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20  endif.  .  rc = 
30d00 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
30d10 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20  Vfs, fd, pFile, 
30d20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73  zPath, ctrlFlags
30d30 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65  );..open_finishe
30d40 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
30d50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
30d60 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55  lite3_free(p->pU
30d70 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  nused);.  }.  re
30d80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
30d90 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
30da0 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  le at zPath. If 
30db0 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
30dc0 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73  ment is true, fs
30dd0 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72  ync().** the dir
30de0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
30df0 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a  eting the file..
30e00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30e10 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  ixDelete(.  sqli
30e20 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30e30 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e  ,     /* VFS con
30e40 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20  taining this as 
30e50 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68  the xDelete meth
30e60 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
30e70 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
30e80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
30e90 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
30ea0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63  */.  int dirSync
30eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30ec0 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63  * If true, fsync
30ed0 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  () directory aft
30ee0 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65  er deleting file
30ef0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
30f00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
30f10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30f20 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
30f30 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
30f40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
30f50 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f  DELETE);.  if( o
30f60 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d  sUnlink(zPath)==
30f70 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20  (-1) ){.    if( 
30f80 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69  errno==ENOENT.#i
30f90 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
30fa0 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73 73       || osAccess
30fb0 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e  (zPath,0)!=0.#en
30fc0 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
30fd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
30fe0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
30ff0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31000 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
31010 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
31020 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b  _DELETE, "unlink
31030 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
31040 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
31050 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
31060 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
31070 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
31080 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
31090 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
310a0 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
310b0 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
310c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
310d0 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56  E_OK ){.#if OS_V
310e0 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28  XWORKS.      if(
310f0 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29   fsync(fd)==-1 )
31100 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
31110 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e   fsync(fd) ).#en
31120 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
31130 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
31140 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
31150 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66  RR_DIR_FSYNC, "f
31160 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20  sync", zPath);. 
31170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62       }.      rob
31180 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
31190 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
311a0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
311b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
311c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
311d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
311e0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
311f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
31200 73 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  st the existence
31210 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
31220 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
31230 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
31240 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
31250 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
31260 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
31270 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
31280 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
31290 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
312a0 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
312b0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
312c0 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
312d0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
312e0 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
312f0 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
31300 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
31310 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
31320 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
31330 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
31340 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
31350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
31360 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
31370 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
31380 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
31390 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
313a0 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
313b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
313c0 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
313d0 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
313e0 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
313f0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
31400 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
31410 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
31420 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
31430 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
31440 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
31450 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
31460 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
31470 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
31480 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
31490 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
314a0 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
314b0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
314c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
314d0 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
314e0 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
314f0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
31500 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
31510 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
31520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31530 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
31540 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
31550 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
31560 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
31570 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
31580 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
31590 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
315a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
315b0 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
315c0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
315d0 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
315e0 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
315f0 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63  pResOut = (osAcc
31600 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65  ess(zPath, amode
31610 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61  )==0);.  if( fla
31620 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
31630 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65  S_EXISTS && *pRe
31640 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75  sOut ){.    stru
31650 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
31660 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
31670 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62  Path, &buf) && b
31680 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
31690 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20  .      *pResOut 
316a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
316b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
316c0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
316d0 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
316e0 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
316f0 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
31700 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
31710 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
31720 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
31730 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
31740 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
31750 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
31760 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
31770 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
31780 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
31790 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
317a0 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
317b0 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
317c0 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
317d0 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
317e0 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
317f0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
31800 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
31810 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
31820 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
31830 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
31840 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
31850 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
31860 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
31870 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
31880 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
31890 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
318a0 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
318b0 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
318c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
318d0 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
318e0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
318f0 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31910 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
31920 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
31930 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
31940 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
31950 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
31960 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
31970 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
31980 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
31990 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
319a0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
319b0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
319c0 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
319d0 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
319e0 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
319f0 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
31a00 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
31a10 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
31a20 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
31a30 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
31a40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
31a50 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
31a60 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
31a70 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
31a80 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
31a90 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
31aa0 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
31ab0 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
31ac0 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
31ad0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
31ae0 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
31af0 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
31b00 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
31b10 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  d;.    if( osGet
31b20 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  cwd(zOut, nOut-1
31b30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
31b40 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
31b50 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
31b60 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
31b70 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
31b80 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
31b90 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
31ba0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
31bb0 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
31bc0 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
31bd0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
31be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31bf0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
31c00 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
31c10 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
31c20 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
31c30 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
31c40 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
31c50 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
31c60 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
31c70 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
31c80 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
31c90 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
31ca0 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
31cb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
31cc0 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
31cd0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
31ce0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
31cf0 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
31d00 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
31d10 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
31d20 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
31d30 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
31d40 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
31d50 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
31d60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
31d70 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
31d80 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
31d90 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
31da0 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
31db0 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
31dc0 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
31dd0 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
31de0 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
31df0 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
31e00 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
31e10 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
31e20 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
31e30 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
31e40 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
31e50 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
31e60 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
31e70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
31e80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
31e90 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
31ea0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
31eb0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
31ec0 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
31ed0 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
31ee0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31ef0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
31f00 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
31f10 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
31f20 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
31f30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
31f40 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
31f50 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
31f60 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
31f70 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
31f80 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
31f90 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
31fa0 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
31fb0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
31fc0 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
31fd0 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
31fe0 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
31ff0 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
32000 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
32010 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
32020 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
32030 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
32040 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
32050 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
32060 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
32070 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
32080 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
32090 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
320a0 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
320b0 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
320c0 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
320d0 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
320e0 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
320f0 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
32100 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
32110 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
32120 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
32130 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
32140 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
32150 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
32160 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
32170 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
32180 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
32190 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
321a0 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
321b0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
321c0 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
321d0 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
321e0 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
321f0 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
32200 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
32210 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
32220 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
32230 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
32240 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
32250 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
32260 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
32270 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
32280 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
32290 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
322a0 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
322b0 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
322c0 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
322d0 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
322e0 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
322f0 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
32300 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
32310 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
32320 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
32330 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
32340 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
32350 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32360 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
32370 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
32380 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
32390 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
323a0 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
323b0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
323c0 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
323d0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
323e0 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
323f0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
32400 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32410 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
32420 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
32430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
32440 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
32450 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
32460 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
32470 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
32480 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
32490 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
324a0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
324b0 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
324c0 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
324d0 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
324e0 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
324f0 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
32500 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
32510 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
32520 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
32530 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
32540 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
32550 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32560 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
32570 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
32580 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
32590 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
325a0 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
325b0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
325c0 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
325d0 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
325e0 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
325f0 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
32600 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
32610 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
32620 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
32630 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
32640 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
32650 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
32660 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
32670 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
32680 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
32690 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
326a0 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
326b0 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
326c0 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
326d0 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
326e0 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
326f0 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
32700 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
32710 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
32720 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
32730 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
32740 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
32750 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
32760 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
32770 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
32780 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
32790 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
327a0 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
327b0 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
327c0 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
327d0 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
327e0 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
327f0 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
32800 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
32810 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
32820 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
32830 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
32840 20 6f 73 47 65 74 70 69 64 28 29 3b 20 20 0a 23   osGetpid();  .#
32850 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
32860 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20  TE_TEST).  {.   
32870 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20 20   int fd, got;.  
32880 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
32890 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
328a0 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b  ", O_RDONLY, 0);
328b0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
328c0 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
328d0 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
328e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
328f0 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
32900 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ));.      memcpy
32910 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29  (&zBuf[sizeof(t)
32920 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50 69  ], &randomnessPi
32930 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  d, sizeof(random
32940 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20 20 20  nessPid));.     
32950 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
32960 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  t)+sizeof(random
32970 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a 65 5f  nessPid)<=(size_
32980 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
32990 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
329a0 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d   + sizeof(random
329b0 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20 7d 65  nessPid);.    }e
329c0 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67  lse{.      do{ g
329d0 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20  ot = osRead(fd, 
329e0 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68  zBuf, nBuf); }wh
329f0 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
32a00 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
32a10 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
32a20 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
32a30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
32a40 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  dif.  return nBu
32a50 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  f;.}.../*.** Sle
32a60 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
32a70 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
32a80 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
32a90 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
32aa0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
32ab0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
32ac0 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
32ad0 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
32ae0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
32af0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
32b00 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
32b10 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
32b20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
32b30 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
32b40 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
32b50 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
32b60 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
32b70 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
32b80 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
32b90 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
32ba0 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
32bb0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
32bc0 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
32bd0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
32be0 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  d, int microseco
32bf0 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  nds){.#if OS_VXW
32c00 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
32c10 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70  mespec sp;..  sp
32c20 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73  .tv_sec = micros
32c30 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30  econds / 1000000
32c40 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d  ;.  sp.tv_nsec =
32c50 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25   (microseconds %
32c60 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30   1000000) * 1000
32c70 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73  ;.  nanosleep(&s
32c80 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53  p, NULL);.  UNUS
32c90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
32ca0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
32cb0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
32cc0 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  lif defined(HAVE
32cd0 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
32ce0 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
32cf0 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
32d00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32d10 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
32d20 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
32d30 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
32d40 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
32d50 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
32d60 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
32d70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  (seconds);.  UNU
32d80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32d90 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
32da0 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
32db0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
32dc0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
32dd0 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
32de0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
32df0 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
32e00 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
32e10 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
32e20 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
32e30 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
32e40 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
32e50 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
32e60 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
32e70 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
32e80 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
32e90 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
32ea0 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
32eb0 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
32ec0 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
32ed0 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
32ee0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
32ef0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
32f00 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
32f10 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
32f20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
32f30 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
32f40 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
32f50 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
32f60 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
32f70 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
32f80 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
32f90 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
32fa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
32fb0 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
32fc0 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
32fd0 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
32fe0 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
32ff0 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
33000 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
33010 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
33020 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
33030 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
33040 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ess, return SQLI
33050 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53  TE_OK.  Return S
33060 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
33070 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
33080 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66   .** cannot be f
33090 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
330a0 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
330b0 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
330c0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73  _vfs *NotUsed, s
330d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
330e0 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Now){.  static c
330f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
33100 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
33110 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
33120 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
33130 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33140 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65  E_OK;.#if define
33150 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
33160 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
33170 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  &t);.  *piNow = 
33180 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
33190 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70  t)*1000 + unixEp
331a0 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  och;.#elif OS_VX
331b0 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
331c0 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
331d0 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
331e0 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
331f0 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  Now);.  *piNow =
33200 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
33210 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
33220 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
33230 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30  Now.tv_nsec/1000
33240 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  000;.#else.  str
33250 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
33260 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f  ;.  if( gettimeo
33270 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d  fday(&sNow, 0)==
33280 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  0 ){.    *piNow 
33290 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
332a0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
332b0 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
332c0 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30  sNow.tv_usec/100
332d0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
332e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
332f0 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  R;.  }.#endif..#
33300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
33310 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
33320 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
33330 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
33340 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
33350 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
33360 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
33370 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
33380 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33390 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
333a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
333b0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
333c0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
333d0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
333e0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
333f0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
33400 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
33410 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
33420 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
33430 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
33440 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
33450 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
33460 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
33470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
33480 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
33490 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
334a0 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
334b0 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  w){.  sqlite3_in
334c0 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  t64 i = 0;.  int
334d0 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41   rc;.  UNUSED_PA
334e0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
334f0 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72  ;.  rc = unixCur
33500 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
33510 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
33520 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
33530 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33540 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68  *.** We added th
33550 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
33560 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68  ) method with th
33570 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70  e intention of p
33580 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74  roviding.** bett
33590 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72  er low-level err
335a0 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e  or messages when
335b0 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65   operating-syste
335c0 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20  m problems come 
335d0 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c  up.** during SQL
335e0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ite operation.  
335f0 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65  But so far, none
33600 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65   of that has bee
33610 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
33620 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53   in the core.  S
33630 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
33640 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
33650 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20   For now, it is 
33660 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63  merely.** a plac
33670 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61  e-holder..*/.sta
33680 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
33690 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
336a0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
336b0 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
336c0 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
336d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
336e0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
336f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
33700 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
33710 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33720 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
33730 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  0;.}.../*.******
33740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33750 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65  ** End of sqlite
33760 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
33770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33780 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
33790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337d0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
337e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
33830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33840 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78  ***** Begin Prox
33850 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
33860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
33880 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
33890 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e  s a "uber-lockin
338a0 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69  g-method" in thi
338b0 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65  s sense:  It use
338c0 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c  s the.** other l
338d0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
338e0 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b  n secondary lock
338f0 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c   files.  Proxy l
33900 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d  ocking is a.** m
33910 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74  eta-layer over t
33920 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74  op of the primit
33930 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ive locking impl
33940 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20  emented above.  
33950 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73  For.** this reas
33960 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
33970 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
33980 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
33990 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a  g is deferred.**
339a0 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74   until late in t
339b0 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61  he file (here) a
339c0 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
339d0 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64  other I/O method
339e0 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64  s have.** been d
339f0 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74  efined - so that
33a00 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
33a10 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61  ocking methods a
33a20 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  re available.** 
33a30 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68  as services to h
33a40 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70  elp with the imp
33a50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  lementation of p
33a60 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  roxy locking..**
33a70 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  .****.**.** The 
33a80 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20  default locking 
33a90 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74  schemes in SQLit
33aa0 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65  e use byte-range
33ab0 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a   locks on the.**
33ac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
33ad0 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66  o coordinate saf
33ae0 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63  e, concurrent ac
33af0 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
33b00 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20   readers.** and 
33b10 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f  writers [http://
33b20 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69  sqlite.org/locki
33b30 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65  ngv3.html].  The
33b40 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69   five file locki
33b50 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e  ng.** states (UN
33b60 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c  LOCKED, PENDING,
33b70 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
33b80 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72  D, EXCLUSIVE) ar
33b90 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  e implemented.**
33ba0 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26   as POSIX read &
33bb0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65   write locks ove
33bc0 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c  r fixed set of l
33bd0 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73  ocations (via fs
33be0 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20  ctl),.** on AFP 
33bf0 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63  and SMB only exc
33c00 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
33c10 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69  e locks are avai
33c20 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a  lable via fsctl.
33c30 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a  ** with _IOWR('z
33c40 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
33c50 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20  teRangeLockPB2) 
33c60 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d  to track the sam
33c70 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54  e 5 states..** T
33c80 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52  o simulate a F_R
33c90 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72  DLCK on the shar
33ca0 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50  ed range, on AFP
33cb0 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65   a randomly sele
33cc0 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20  cted.** address 
33cd0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  in the shared ra
33ce0 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
33cf0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
33d00 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68  the entire.** sh
33d10 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
33d20 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55  ken for an EXCLU
33d30 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a  SIVE lock):.**.*
33d40 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  *      PENDING_B
33d50 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30  YTE        0x400
33d60 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45  00000.**      RE
33d70 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20  SERVED_BYTE     
33d80 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20    0x40000001.** 
33d90 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47       SHARED_RANG
33da0 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
33db0 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30  002 -> 0x4000020
33dc0 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  0.**.** This wor
33dd0 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c  ks well on the l
33de0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
33df0 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65  , but shows a ne
33e00 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f  arly 100x.** slo
33e10 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65  wdown in read pe
33e20 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50  rformance on AFP
33e30 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50   because the AFP
33e40 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73   client disables
33e50 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63  .** the read cac
33e60 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e  he when byte-ran
33e70 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65  ge locks are pre
33e80 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20  sent.  Enabling 
33e90 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68  the read.** cach
33ea0 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68  e exposes a cach
33eb0 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62  e coherency prob
33ec0 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73  lem that is pres
33ed0 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a  ent on all OS X.
33ee0 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74  ** supported net
33ef0 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d  work file system
33f00 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20  s.  NFS and AFP 
33f10 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65  both observe the
33f20 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65  .** close-to-ope
33f30 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20  n semantics for 
33f40 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63  ensuring cache c
33f50 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74  oherency.** [htt
33f60 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f  p://nfs.sourcefo
33f70 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d  rge.net/#faq_a8]
33f80 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  , which does not
33f90 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20   effectively.** 
33fa0 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75  address the requ
33fb0 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e  irements for con
33fc0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
33fd0 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
33fe0 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61  ple.** readers a
33ff0 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68  nd writers.** [h
34000 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65  ttp://www.nabble
34010 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e  .com/SQLite-on-N
34020 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e  FS-cache-coheren
34030 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74  cy-td15655701.ht
34040 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64  ml]..**.** To ad
34050 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72  dress the perfor
34060 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20  mance and cache 
34070 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73  coherency issues
34080 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  , proxy file loc
34090 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
340a0 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65  the way database
340b0 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72   access is contr
340c0 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e  olled by limitin
340d0 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a  g access to a.**
340e0 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20   single host at 
340f0 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e  a time and movin
34100 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66  g file locks off
34110 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
34120 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74   file.** and ont
34130 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f  o a proxy file o
34140 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
34150 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a   system.  .**.**
34160 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20  .** Using proxy 
34170 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  locks.** -------
34180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
34190 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73   C APIs.**.**  s
341a0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
341b0 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
341c0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54  SQLITE_FCNTL_SET
341d0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a  _LOCKPROXYFILE,.
341e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
341f0 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f           <proxy_
34200 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22  path> | ":auto:"
34210 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  );.**  sqlite3_f
34220 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
34230 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46  dbname, SQLITE_F
34240 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_GET_LOCKPRO
34250 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
34260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34270 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b   &<proxy_path>);
34280 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72  .**.**.** SQL pr
34290 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41  agmas.**.**  PRA
342a0 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
342b0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c  ock_proxy_file=<
342c0 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61  proxy_path> | :a
342d0 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  uto:.**  PRAGMA 
342e0 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
342f0 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a  proxy_file.**.**
34300 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75   Specifying ":au
34310 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20  to:" means that 
34320 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  if there is a co
34330 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20  nch file with a 
34340 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74  matching.** host
34350 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70   ID in it, the p
34360 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65  roxy path in the
34370 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
34380 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77   be used, otherw
34390 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70  ise.** a proxy p
343a0 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ath based on the
343b0 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72   user's temp dir
343c0 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72  .** (via confstr
343d0 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
343e0 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20  _TEMP_DIR,...)) 
343f0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64  will be used and
34400 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70   the.** actual p
34410 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  roxy file name i
34420 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
34430 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61   the name and pa
34440 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  th of the.** dat
34450 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72  abase file.  For
34460 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
34470 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61        For databa
34480 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f  se path "/Users/
34490 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20  me/foo.db" .**  
344a0 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61       The lock pa
344b0 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70  th will be "<tmp
344c0 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b  dir>/sqliteplock
344d0 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e  s/_Users_me_foo.
344e0 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a  db:auto:").**.**
344f0 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f   Once a lock pro
34500 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  xy is configured
34510 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
34520 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63  connection, it c
34530 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d  an not.** be rem
34540 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74  oved, however it
34550 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64   may be switched
34560 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
34570 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a  proxy path via.*
34580 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73  * the above APIs
34590 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63   (assuming the c
345a0 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74  onch file is not
345b0 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61   being held by a
345c0 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63  nother.** connec
345d0 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29  tion or process)
345e0 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20  . .**.**.** How 
345f0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f  proxy locking wo
34600 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  rks.** ---------
34610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
34620 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20  *.** Proxy file 
34630 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70  locking relies p
34640 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20  rimarily on two 
34650 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66  new supporting f
34660 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  iles: .**.**   *
34670 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20    conch file to 
34680 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20  limit access to 
34690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
346a0 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f  e to a single ho
346b0 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20  st.**      at a 
346c0 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  time.**.**   *  
346d0 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63  proxy file to ac
346e0 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72  t as a proxy for
346f0 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f   the advisory lo
34700 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  cks normally.** 
34710 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68       taken on th
34720 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  e database.**.**
34730 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
34740 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79  - to use a proxy
34750 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75   file, sqlite mu
34760 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74  st first "hold t
34770 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20  he conch".** by 
34780 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  taking an sqlite
34790 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f  -style shared lo
347a0 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
347b0 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68  file, reading th
347c0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e  e.** contents an
347d0 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  d comparing the 
347e0 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f  host's unique ho
347f0 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77  st ID (see below
34800 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72  ) and lock.** pr
34810 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74  oxy path against
34820 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
34830 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e  ed in the conch.
34840 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65    The conch file
34850 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e   is.** stored in
34860 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
34870 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62  ory as the datab
34880 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
34890 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73   file name.** is
348a0 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72   patterned after
348b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
348c0 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61  le name as ".<da
348d0 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63  tabasename>-conc
348e0 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  h"..** If the co
348f0 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nch file does no
34900 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 73 20  t exist, or its 
34910 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
34920 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73  match the.** hos
34930 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78  t ID and/or prox
34940 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65  y path, then the
34950 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74   lock is escalat
34960 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69  ed to an exclusi
34970 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74  ve.** lock and t
34980 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
34990 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65  ntents is update
349a0 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20  d with the host 
349b0 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20  ID and proxy.** 
349c0 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63  path and the loc
349d0 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20  k is downgraded 
349e0 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
349f0 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20   again.  If the 
34a00 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64  conch.** is held
34a10 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   by another proc
34a20 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72  ess (with a shar
34a30 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78  ed lock), the ex
34a40 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
34a50 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51  will fail and SQ
34a60 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
34a70 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
34a80 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20   proxy file - a 
34a90 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65  single-byte file
34aa0 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64   used for all ad
34ab0 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b  visory file lock
34ac0 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61  s.** normally ta
34ad0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
34ae0 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73  ase file.   This
34af0 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65   allows for safe
34b00 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74   sharing.** of t
34b10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34b20 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65   for multiple re
34b30 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
34b40 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
34b50 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68   host (the conch
34b60 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
34b70 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73  ey all use the s
34b80 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  ame local lock f
34b90 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75  ile)..**.** Requ
34ba0 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  esting the lock 
34bb0 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69  proxy does not i
34bc0 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20  mmediately take 
34bd0 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73  the conch, it is
34be0 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77  .** only taken w
34bf0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65  hen the first re
34c00 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61  quest to lock da
34c10 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
34c20 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d  ade.  .** This m
34c30 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e  atches the seman
34c40 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64  tics of the trad
34c50 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  itional locking 
34c60 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a  behavior, where.
34c70 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e  ** opening a con
34c80 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
34c90 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20  abase file does 
34ca0 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20  not take a lock 
34cb0 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68  on it..** The sh
34cc0 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e  ared lock and an
34cd0 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   open file descr
34ce0 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61  iptor are mainta
34cf0 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74  ined until .** t
34d00 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
34d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
34d20 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   closed. .**.** 
34d30 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61  The proxy file a
34d40 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  nd the lock file
34d50 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74   are never delet
34d60 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20  ed so they only 
34d70 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72  need.** to be cr
34d80 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20  eated the first 
34d90 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73  time they are us
34da0 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67  ed..**.** Config
34db0 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a  uration options.
34dc0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
34dd0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20  --------.**.**  
34de0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
34df0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a  OXY_LOCKING.**.*
34e00 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65  *       Database
34e10 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20   files accessed 
34e20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  on non-local fil
34e30 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a  e systems are.**
34e40 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63         automatic
34e50 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ally configured 
34e60 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
34e70 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72  g, lock files ar
34e80 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64  e.**       named
34e90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
34ea0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
34eb0 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  gic as.**       
34ec0 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78  PRAGMA lock_prox
34ed0 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a  y_file=":auto:".
34ee0 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54  **    .**  SQLIT
34ef0 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a  E_PROXY_DEBUG.**
34f00 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65  .**       Enable
34f10 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66  s the logging of
34f20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
34f30 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66  during host id f
34f40 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ile.**       ret
34f50 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74  rieval and creat
34f60 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50  ion.**.**  LOCKP
34f70 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20  ROXYDIR.**.**   
34f80 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68      Overrides th
34f90 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
34fa0 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
34fb0 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68  k proxy files th
34fc0 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  at.**       are 
34fd0 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
34fe0 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75  lly via the ":au
34ff0 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a  to:" setting.**.
35000 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55  **  SQLITE_DEFAU
35010 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
35020 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20  ISSIONS.**.**   
35030 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20      Permissions 
35040 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61  to use when crea
35050 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ting a directory
35060 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65   for storing the
35070 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70  .**       lock p
35080 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79  roxy files, only
35090 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50   used when LOCKP
350a0 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73  ROXYDIR is not s
350b0 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20  et..**    .**   
350c0 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65   .** As mentione
350d0 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f  d above, when co
350e0 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
350f0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
35100 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74  LOCKING,.** sett
35110 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  ing the environm
35120 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c  ent variable SQL
35130 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
35140 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c  LOCKING to 1 wil
35150 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79  l.** force proxy
35160 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75   locking to be u
35170 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61  sed for every da
35180 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
35190 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c  ed, and 0.** wil
351a0 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69  l force automati
351b0 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  c proxy locking 
351c0 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66  to be disabled f
351d0 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
351e0 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63  ** files (explic
351f0 69 74 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  itly calling the
35200 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
35210 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
35220 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c  pragma or.** sql
35230 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ite_file_control
35240 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65   API is not affe
35250 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46  cted by SQLITE_F
35260 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
35270 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50  NG)..*/../*.** P
35280 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
35290 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
352a0 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66  n MacOSX .*/.#if
352b0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
352c0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
352d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
352e0 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  LE../*.** The pr
352f0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
35300 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61  t has the path a
35310 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  nd file structur
35320 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74  es for the remot
35330 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20  e .** and local 
35340 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69  proxy files in i
35350 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  t.*/.typedef str
35360 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
35370 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63  Context proxyLoc
35380 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
35390 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
353a0 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78  Context {.  unix
353b0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
353c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
353d0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
353e0 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65   char *conchFile
353f0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
35400 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
35410 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ch file */.  uni
35420 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
35430 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
35440 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  n proxy lock fil
35450 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
35460 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20  kProxyPath;     
35470 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
35480 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
35490 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62  le */.  char *db
354a0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
354b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
354c0 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
354d0 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64  .  int conchHeld
354e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
354f0 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63  /* 1 if the conc
35500 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66  h is held, -1 if
35510 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 69   lockless */.  i
35520 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20 20 20 20  nt nFails;      
35530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
35540 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63 68 20 74  umber of conch t
35550 61 6b 69 6e 67 20 66 61 69 6c 75 72 65 73 20 2a  aking failures *
35560 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63  /.  void *oldLoc
35570 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
35580 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63   /* Original loc
35590 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72  kingcontext to r
355a0 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20  estore on close 
355b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  */.  sqlite3_io_
355c0 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
355d0 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f  OldMethod;     /
355e0 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d  * Original I/O m
355f0 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65  ethods for close
35600 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54   */.};../* .** T
35610 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
35620 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65 20  le path for the 
35630 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50 61  database at dbPa
35640 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  th is written in
35650 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68  to lPath, .** wh
35660 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ich must point t
35670 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c  o valid, writabl
35680 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65  e memory large e
35690 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c  nough for a maxL
356a0 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c  en length.** fil
356b0 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74  e path. .*/.stat
356c0 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c  ic int proxyGetL
356d0 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
356e0 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72  ar *dbPath, char
356f0 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20   *lPath, size_t 
35700 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c  maxLen){.  int l
35710 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b  en;.  int dbLen;
35720 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65  .  int i;..#ifde
35730 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20  f LOCKPROXYDIR. 
35740 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
35750 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44  Path, LOCKPROXYD
35760 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c  IR, maxLen);.#el
35770 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44  se.# ifdef _CS_D
35780 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
35790 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20  DIR.  {.    if( 
357a0 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52  !confstr(_CS_DAR
357b0 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
357c0 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e  R, lPath, maxLen
357d0 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  ) ){.      OSTRA
357e0 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48  CE(("GETLOCKPATH
357f0 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e    failed %s errn
35800 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  o=%d pid=%d\n",.
35810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
35820 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 6f 73 47  Path, errno, osG
35830 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20  etpid()));.     
35840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
35850 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  OERR_LOCK;.    }
35860 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
35870 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
35880 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
35890 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73  );    .  }.# els
358a0 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  e.  len = strlcp
358b0 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22  y(lPath, "/tmp/"
358c0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64  , maxLen);.# end
358d0 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  if.#endif..  if(
358e0 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27   lPath[len-1]!='
358f0 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  /' ){.    len = 
35900 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
35910 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d  /", maxLen);.  }
35920 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f  .  .  /* transfo
35930 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74  rm the db path t
35940 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65  o a unique cache
35950 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e   name */.  dbLen
35960 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
35970 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69  bPath);.  for( i
35980 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28  =0; i<dbLen && (
35990 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61  i+len+7)<(int)ma
359a0 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xLen; i++){.    
359b0 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b  char c = dbPath[
359c0 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b  i];.    lPath[i+
359d0 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f  len] = (c=='/')?
359e0 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61  '_':c;.  }.  lPa
359f0 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a  th[i+len]='\0';.
35a00 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c    strlcat(lPath,
35a10 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65   ":auto:", maxLe
35a20 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  n);.  OSTRACE(("
35a30 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  GETLOCKPATH  pro
35a40 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
35a50 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68  pid=%d\n", lPath
35a60 2c 20 6f 73 47 65 74 70 69 64 28 29 29 29 3b 0a  , osGetpid()));.
35a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35a80 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
35a90 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
35aa0 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
35ab0 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
35ac0 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
35ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35ae0 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
35af0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
35b00 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
35b10 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
35b20 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
35b30 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
35b40 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
35b50 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
35b60 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
35b70 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
35b80 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
35b90 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
35ba0 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
35bb0 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
35bc0 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
35bd0 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
35be0 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
35bf0 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
35c00 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
35c10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
35c20 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
35c30 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
35c40 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
35c50 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
35c60 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
35c70 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
35c80 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
35c90 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
35ca0 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
35cb0 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
35cc0 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
35cd0 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
35ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
35cf0 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
35d00 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66   if( osMkdir(buf
35d10 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
35d20 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
35d30 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
35d40 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
35d50 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
35d60 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
35d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
35d80 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
35d90 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
35da0 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
35db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35dc0 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
35dd0 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
35de0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
35df0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
35e00 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
35e10 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65 74 70 69  ockPath, osGetpi
35e20 64 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  d()));.         
35e30 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20     return err;. 
35e40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35e50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35e60 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20     start=i+1;.  
35e70 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d    }.    buf[i] =
35e80 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20   lockPath[i];.  
35e90 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52  }.  OSTRACE(("CR
35ea0 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72  EATELOCKPATH  pr
35eb0 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
35ec0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b   pid=%d\n", lock
35ed0 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28 29  Path, osGetpid()
35ee0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
35ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
35f00 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64  a new VFS file d
35f10 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65  escriptor (store
35f20 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
35f30 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
35f40 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64  ite3_malloc) and
35f50 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   open the file n
35f60 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74  amed "path" in t
35f70 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
35f80 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
35f90 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
35fa0 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72  ble not only for
35fb0 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c   closing the fil
35fc0 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
35fd0 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65  but also for fre
35fe0 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20  eing the memory 
35ff0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
36000 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
36010 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
36020 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e  nt proxyCreateUn
36030 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73  ixFile(.    cons
36040 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
36050 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72       /* path for
36060 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
36070 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c  e */.    unixFil
36080 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20  e **ppFile,     
36090 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72    /* unixFile cr
360a0 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eated and return
360b0 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20  ed by ref */.   
360c0 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20   int islockfile 
360d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
360e0 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67  non zero missing
360f0 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72   dirs will be cr
36100 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69  eated */.) {.  i
36110 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e  nt fd = -1;.  un
36120 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20  ixFile *pNew;.  
36130 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36140 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  OK;.  int openFl
36150 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
36160 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65  _CREAT;.  sqlite
36170 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a  3_vfs dummyVfs;.
36180 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30    int terrno = 0
36190 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
361a0 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c   *pUnused = NULL
361b0 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74  ;..  /* 1. first
361c0 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65   try to open/cre
361d0 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a  ate the file.  *
361e0 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 2. if that fai
361f0 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ls, and this is 
36200 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74  a lock file (not
36210 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65  -conch), try cre
36220 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70  ating.  ** the p
36230 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65  arent directorie
36240 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61  s and then try a
36250 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66  gain..  ** 3. if
36260 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79   that fails, try
36270 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
36280 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a  e read-only.  **
36290 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   otherwise retur
362a0 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20  n BUSY (if lock 
362b0 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45  file) or CANTOPE
362c0 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  N for the conch 
362d0 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75  file.  */.  pUnu
362e0 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
362f0 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46  leFd(path, openF
36300 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e  lags);.  if( pUn
36310 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d  used ){.    fd =
36320 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
36330 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73  }else{.    pUnus
36340 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
36350 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  loc(sizeof(*pUnu
36360 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21  sed));.    if( !
36370 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
36380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36390 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
363a0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
363b0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
363c0 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
363d0 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72  gs, 0);.    terr
363e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
363f0 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
36400 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c  o==ENOENT && isl
36410 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
36420 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65   if( proxyCreate
36430 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d  LockPath(path) =
36440 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
36450 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75         fd = robu
36460 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
36470 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
36480 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
36490 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
364a0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
364b0 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
364c0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
364d0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  , openFlags, 0);
364e0 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
364f0 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  rno;.  }.  if( f
36500 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  d<0 ){.    if( i
36510 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
36520 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36530 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
36540 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
36550 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
36560 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
36570 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
36580 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
36590 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
365a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
365b0 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
365c0 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
365d0 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
365e0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
365f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
36600 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
36610 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
36620 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
36630 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
36640 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
36650 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
36660 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36670 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
36680 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
36690 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
366a0 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  New, 0, sizeof(u
366b0 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65  nixFile));.  pNe
366c0 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  w->openFlags = o
366d0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73  penFlags;.  mems
366e0 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c  et(&dummyVfs, 0,
366f0 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73   sizeof(dummyVfs
36700 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70  ));.  dummyVfs.p
36710 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  AppData = (void*
36720 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
36730 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a  er;.  dummyVfs.z
36740 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a  Name = "dummy";.
36750 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
36760 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
36770 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
36780 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
36790 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
367a0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
367b0 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
367c0 20 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69   fd, (sqlite3_fi
367d0 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20  le*)pNew, path, 
367e0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
367f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
36800 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20  ppFile = pNew;. 
36810 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36820 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65  _OK;.  }.end_cre
36830 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20  ate_proxy:    . 
36840 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
36850 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  ew, fd, __LINE__
36860 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
36870 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74  e(pNew);.  sqlit
36880 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29  e3_free(pUnused)
36890 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
368a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
368b0 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65  TEST./* simulate
368c0 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
368d0 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
368e0 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
368f0 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  aths */.int sqli
36900 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d  te3_hostid_num =
36910 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   0;.#endif..#def
36920 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ine PROXY_HOSTID
36930 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f  LEN    16  /* co
36940 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64  nch file host id
36950 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e   length */../* N
36960 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65  ot always define
36970 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 73  d in the headers
36980 20 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20   as it ought to 
36990 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74  be */.extern int
369a0 20 67 65 74 68 6f 73 74 75 75 69 64 28 75 75 69   gethostuuid(uui
369b0 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74  d_t id, const st
369c0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77  ruct timespec *w
369d0 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68  ait);../* get th
369e0 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65  e host ID via ge
369f0 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f  thostuuid(), pHo
36a00 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20  stID must point 
36a10 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  to PROXY_HOSTIDL
36a20 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20  EN .** bytes of 
36a30 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e  writable memory.
36a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
36a50 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e  roxyGetHostID(un
36a60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f  signed char *pHo
36a70 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f  stID, int *pErro
36a80 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f  r){.  assert(PRO
36a90 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20  XY_HOSTIDLEN == 
36aa0 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b  sizeof(uuid_t));
36ab0 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49  .  memset(pHostI
36ac0 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54  D, 0, PROXY_HOST
36ad0 49 44 4c 45 4e 29 3b 0a 23 20 69 66 20 64 65 66  IDLEN);.# if def
36ae0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
36af0 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f 58 5f  && ((__MAC_OS_X_
36b00 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
36b10 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c 7c 20  IRED > 1050) || 
36b20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
36b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 5f                (_
36b40 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53 49  _IPHONE_OS_VERSI
36b50 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20  ON_MIN_REQUIRED 
36b60 3e 20 32 30 30 30 29 29 0a 20 20 7b 0a 20 20 20  > 2000)).  {.   
36b70 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
36b80 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30   timeout = {1, 0
36b90 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65  }; /* 1 sec time
36ba0 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  out */.    if( g
36bb0 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74  ethostuuid(pHost
36bc0 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b  ID, &timeout) ){
36bd0 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d  .      int err =
36be0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
36bf0 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
36c00 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72      *pError = er
36c10 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
36c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
36c30 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
36c40 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
36c50 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29  ARAMETER(pError)
36c60 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
36c70 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
36c80 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70   simulate multip
36c90 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61  le hosts by crea
36ca0 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74  ting unique host
36cb0 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f  id file paths */
36cc0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68  .  if( sqlite3_h
36cd0 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b  ostid_num != 0){
36ce0 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20  .    pHostID[0] 
36cf0 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44  = (char)(pHostID
36d00 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c  [0] + (char)(sql
36d10 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
36d20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65  & 0xFF));.  }.#e
36d30 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e  ndif.  .  return
36d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
36d50 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
36d60 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65   contains the he
36d70 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e  ader, host id an
36d80 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
36d90 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  . */.#define PRO
36da0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
36db0 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65  2   /* 1-byte he
36dc0 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f  ader, 16-byte ho
36dd0 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23  st id, path */.#
36de0 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41  define PROXY_HEA
36df0 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a  DERLEN    1   /*
36e00 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64   conch file head
36e10 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65  er length */.#de
36e20 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49  fine PROXY_PATHI
36e30 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48  NDEX    (PROXY_H
36e40 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
36e50 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e  OSTIDLEN).#defin
36e60 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  e PROXY_MAXCONCH
36e70 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44  LEN  (PROXY_HEAD
36e80 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
36e90 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e  IDLEN+MAXPATHLEN
36ea0 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20  )../* .** Takes 
36eb0 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69  an open conch fi
36ec0 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63  le, copies the c
36ed0 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77  ontents to a new
36ee0 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d   path and then m
36ef0 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b  oves .** it back
36f00 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65  .  The newly cre
36f10 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65  ated file's file
36f20 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
36f30 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a  ssigned to the.*
36f40 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72  * conch file str
36f50 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c  ucture and final
36f60 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ly the original 
36f70 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72  conch file descr
36f80 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f  iptor is .** clo
36f90 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65  sed.  Returns ze
36fa0 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ro if successful
36fb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36fc0 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
36fd0 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
36fe0 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f  ile, uuid_t myHo
36ff0 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  stID){.  proxyLo
37000 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
37010 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
37020 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
37030 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37040 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
37050 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
37060 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63  ->conchFile;.  c
37070 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54  har tPath[MAXPAT
37080 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75  HLEN];.  char bu
37090 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
370a0 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50  LEN];.  char *cP
370b0 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ath = pCtx->conc
370c0 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a  hFilePath;.  siz
370d0 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b  e_t readLen = 0;
370e0 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65  .  size_t pathLe
370f0 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72  n = 0;.  char er
37100 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20  rmsg[64] = "";. 
37110 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
37120 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55  int rc = -1;.  U
37130 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
37140 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a  myHostID);..  /*
37150 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
37160 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68  th by replace th
37170 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e  e trailing '-con
37180 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b  ch' with '-break
37190 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d  ' */.  pathLen =
371a0 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20   strlcpy(tPath, 
371b0 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  cPath, MAXPATHLE
371c0 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65  N);.  if( pathLe
371d0 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20  n>MAXPATHLEN || 
371e0 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20  pathLen<6 || .  
371f0 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61     (strlcpy(&tPa
37200 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22  th[pathLen-5], "
37210 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29  break", 6) != 5)
37220 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
37230 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
37240 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22  errmsg),errmsg,"
37250 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20  path error (len 
37260 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65  %d)",(int)pathLe
37270 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
37280 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
37290 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f    /* read the co
372a0 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  nch content */. 
372b0 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65   readLen = osPre
372c0 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
372d0 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43   buf, PROXY_MAXC
372e0 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69  ONCHLEN, 0);.  i
372f0 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59  f( readLen<PROXY
37300 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20  _PATHINDEX ){.  
37310 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
37320 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
37330 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65  ),errmsg,"read e
37340 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28  rror (len %d)",(
37350 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20  int)readLen);.  
37360 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
37370 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77  lock;.  }.  /* w
37380 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
37390 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65  he temporary bre
373a0 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20  ak file */.  fd 
373b0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50  = robust_open(tP
373c0 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43  ath, (O_RDWR|O_C
373d0 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29  REAT|O_EXCL), 0)
373e0 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
373f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
37400 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
37410 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72  sg), errmsg, "cr
37420 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  eate failed (%d)
37430 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
37440 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
37450 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50  k;.  }.  if( osP
37460 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72  write(fd, buf, r
37470 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73  eadLen, 0) != (s
37480 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29  size_t)readLen )
37490 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
374a0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
374b0 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
374c0 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64  write failed (%d
374d0 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
374e0 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
374f0 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  ck;.  }.  if( re
37500 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74  name(tPath, cPat
37510 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  h) ){.    sqlite
37520 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
37530 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
37540 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65  g, "rename faile
37550 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
37560 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
37570 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72  eaklock;.  }.  r
37580 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66  c = 0;.  fprintf
37590 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20  (stderr, "broke 
375a0 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
375b0 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72  \n", cPath);.  r
375c0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
375d0 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  e, conchFile->h,
375e0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f   __LINE__);.  co
375f0 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b  nchFile->h = fd;
37600 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  .  conchFile->op
37610 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
37620 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64   | O_CREAT;..end
37630 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66  _breaklock:.  if
37640 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
37650 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  fd>=0 ){.      o
37660 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a  sUnlink(tPath);.
37670 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
37680 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f  se(pFile, fd, __
37690 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
376a0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
376b0 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72  r, "failed to br
376c0 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  eak stale lock o
376d0 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61  n %s, %s\n", cPa
376e0 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d  th, errmsg);.  }
376f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37700 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71  ./* Take the req
37710 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  uested lock on t
37720 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e  he conch file an
37730 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20  d break a stale 
37740 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20  lock if the .** 
37750 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e  host id matches.
37760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37770 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e  roxyConchLock(un
37780 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
37790 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20  uid_t myHostID, 
377a0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20  int lockType){. 
377b0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
377c0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
377d0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
377e0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
377f0 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
37800 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
37810 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
37820 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
37830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
37840 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73   nTries = 0;.  s
37850 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63  truct timespec c
37860 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a  onchModTime;.  .
37870 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d    memset(&conchM
37880 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f  odTime, 0, sizeo
37890 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29  f(conchModTime))
378a0 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ;.  do {.    rc 
378b0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
378c0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
378d0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
378e0 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
378f0 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a  .    nTries ++;.
37900 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37910 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
37920 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20   /* If the lock 
37930 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20  failed (busy):. 
37940 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a        * 1st try:
37950 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d   get the mod tim
37960 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20  e of the conch, 
37970 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72  wait 0.5s and tr
37980 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20  y again. .      
37990 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c   * 2nd try: fail
379a0 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65   if the mod time
379b0 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74   changed or host
379c0 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74   id is different
379d0 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a  , wait .       *
379e0 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65             10 se
379f0 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a  c and try again.
37a00 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79         * 3rd try
37a10 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  : break the lock
37a20 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20   unless the mod 
37a30 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64  time has changed
37a40 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
37a50 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
37a60 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  f;.      if( osF
37a70 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  stat(conchFile->
37a80 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
37a90 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
37aa0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
37ab0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
37ac0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
37ad0 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
37ae0 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
37af0 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ies==1 ){.      
37b00 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d    conchModTime =
37b10 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
37b20 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65  c;.        uslee
37b30 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  p(500000); /* wa
37b40 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74  it 0.5 sec and t
37b50 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
37b60 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  n*/.        cont
37b70 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a  inue;  .      }.
37b80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
37b90 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20  Tries>1 );.     
37ba0 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d   if( conchModTim
37bb0 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e  e.tv_sec != buf.
37bc0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
37bd0 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  sec || .        
37be0 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
37bf0 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  _nsec != buf.st_
37c00 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65  mtimespec.tv_nse
37c10 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
37c20 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
37c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
37c40 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
37c50 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20  ==2 ){  .       
37c60 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59   char tBuf[PROXY
37c70 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
37c80 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d         int len =
37c90 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69   osPread(conchFi
37ca0 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f  le->h, tBuf, PRO
37cb0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
37cc0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
37cd0 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  len<0 ){.       
37ce0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
37cf0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
37d00 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
37d10 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
37d20 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
37d30 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
37d40 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
37d50 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
37d60 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
37d70 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
37d80 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
37d90 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
37da0 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
37db0 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
37dc0 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
37dd0 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
37de0 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
37df0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
37e00 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
37e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37e20 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
37e30 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
37e40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
37e50 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
37e60 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
37e70 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
37e80 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
37e90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37ea0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
37eb0 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
37ec0 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
37ed0 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
37ee0 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
37ef0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
37f00 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
37f10 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
37f20 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
37f30 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
37f40 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
37f50 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
37f60 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
37f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37f80 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
37f90 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
37fa0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
37fb0 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
37fc0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
37fd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
37fe0 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
37ff0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
38000 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72  }.        if( !r
38010 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
38020 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
38030 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
38040 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
38050 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
38060 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
38070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77     }.    }.  } w
38080 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
38090 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c  _BUSY && nTries<
380a0 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  3 );.  .  return
380b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73   rc;.}../* Takes
380c0 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61   the conch by ta
380d0 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  king a shared lo
380e0 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20  ck and read the 
380f0 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20  contents conch, 
38100 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  if .** lockPath 
38110 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
38120 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63   host ID and loc
38130 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74  k file path must
38140 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20   match.  A NULL 
38150 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61  .** lockPath mea
38160 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ns that the lock
38170 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  Path in the conc
38180 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
38190 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  sed if the .** h
381a0 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f  ost IDs match, o
381b0 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74  r a new lock pat
381c0 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  h will be genera
381d0 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
381e0 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65  y .** and writte
381f0 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66  n to the conch f
38200 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
38210 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  nt proxyTakeConc
38220 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
38230 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
38240 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
38250 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
38260 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
38270 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
38280 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  .  .  if( pCtx->
38290 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a  conchHeld!=0 ){.
382a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
382b0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
382c0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
382d0 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
382e0 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75  onchFile;.    uu
382f0 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20  id_t myHostID;. 
38300 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
38310 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64  0;.    char read
38320 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
38330 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
38340 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
38350 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
38360 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20  *tempLockPath = 
38370 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63  NULL;.    int rc
38380 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
38390 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63    int createConc
383a0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68  h = 0;.    int h
383b0 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a  ostIdMatch = 0;.
383c0 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20      int readLen 
383d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79  = 0;.    int try
383e0 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
383f0 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65  .    int forceNe
38400 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  wLockPath = 0;. 
38410 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28     .    OSTRACE(
38420 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
38430 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
38440 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
38450 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
38460 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
38470 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
38480 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
38490 3a 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  :"),.           
384a0 20 20 6f 73 47 65 74 70 69 64 28 29 29 29 3b 0a    osGetpid()));.
384b0 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47  .    rc = proxyG
384c0 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49  etHostID(myHostI
384d0 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  D, &pError);.   
384e0 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
384f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
38500 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
38510 72 72 6e 6f 28 70 46 69 6c 65 2c 20 70 45 72 72  rrno(pFile, pErr
38520 6f 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  or);.      goto 
38530 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
38540 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72     }.    rc = pr
38550 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
38560 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48  le, myHostID, SH
38570 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
38580 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
38590 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
385a0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
385b0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64     }.    /* read
385c0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f   the existing co
385d0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20